17
我努力尝试,但没有找到明确比较“listenablefuture”和“completablefuture”的文章或博客,并提供了相同的分析。所以如果任何人能够解释或指向我这样的博客或文章,那对我来说真的很好。谢谢Listenablefuture vs Completablefuture
我努力尝试,但没有找到明确比较“listenablefuture”和“completablefuture”的文章或博客,并提供了相同的分析。所以如果任何人能够解释或指向我这样的博客或文章,那对我来说真的很好。谢谢Listenablefuture vs Completablefuture
ListenableFuture和CompletableFuture都可以通过允许调用者以某种方式“注册”回调,以便在异步操作完成后调用它的父类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()获得的值将使用参数值设置。
换句话说...... ListenableFuture是一个深思熟虑的干净的界面,而CompletableFuture(和CompletionStage接口,因为它暴露了'toCompletableFuture')是危险的,因为它暴露了'complete'方法。又一个我们期待从Oracle那里得到的未经深思熟虑的垃圾的例子。 –
'CompletionStage'如果扩展'Future'并且不暴露'toCompletableFuture'会很好。然后他们可以将其命名为“ChainableFuture”。 –
'Future'和'ListenableFuture'是接口,而'CompletableFuture'是一个实现'Future'的类。 – cozyconemotel