我努力了,但没有找到明确比较ListenableFuture
和CompletableFuture
的文章或博客,并提供了一个很好的分析。
因此,如果有人能够解释或指向我这样的博客或文章,那对我来说真的很好。
答案 0 :(得分:33)
ListenableFuture 和 CompletableFuture 都可以通过允许调用者以某种方式“注册”来优于其父类 Future 异步操作完成后调用回调。
使用 Future ,您可以执行此操作:
ExecutorService executor = ...;
Future f = executor.submit(...);
f.get();
f.get()
被阻止,直到异步操作完成。
使用 ListenableFuture ,您可以注册这样的回调:
ListenableFuture listenable = service.submit(...);
Futures.addCallback(listenable, new FutureCallback<Object>() {
@Override
public void onSuccess(Object o) {
//handle on success
}
@Override
public void onFailure(Throwable throwable) {
//handle on failure
}
})
使用 CompletableFuture ,您还可以注册回调时间 任务已完成,但它与 ListenableFuture 不同,因为它可以从任何希望它完成的线程中完成。
CompletableFuture completableFuture = new CompletableFuture();
completableFuture.whenComplete(new BiConsumer() {
@Override
public void accept(Object o, Object o2) {
//handle complete
}
}); // complete the task
completableFuture.complete(new Object())
当线程在任务上调用完成时,如果任务尚未完成,则使用参数值设置从get()调用接收的值。