Listablelefuture 与 Completablefuture

我努力尝试,但没有找到任何文章或博客,明确比较 ListenableFutureCompletableFuture,并提供了良好的分析。

因此,如果有人能解释或指出我这样的博客或文章,这将是非常好的我。

44791 次浏览

与其父类 未来相比,聆听未来完整的未来都有一个优势,它们允许调用方以这样或那样的方式“注册”一个在异步操作完成时调用的回调。

使用 未来你可以这样做:

ExecutorService executor = ...;
Future f = executor.submit(...);
f.get();

在完成异步操作之前,f.get()将被阻塞。

使用 聆听未来,您可以注册如下的回调:

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 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 ()调用接收到的值。

阅读 CompletableFuture

番石榴的未来有其局限性:

  1. 监听器是列表,但通常只使用1-overkill。如果需要多个侦听器,请在下一阶段中处理它,或者考虑消息传递。

  2. SetException 将返回值设置为 Exception,因此用户必须使用 instanceof 来区分 Exception 是否在 get(),就像番石榴 AbstractFuture 所做的那样。

  3. 在 Future 流水线中,太多的层 addListener()使得代码难以阅读。

我更喜欢 CompletableFuture.supply().thenApply().thenAccept().handle()