Listenablefuture 与 Completablefuture

Listenablefuture vs Completablefuture

我试了很多,但没有找到任何文章或博客清楚地比较 ListenableFutureCompletableFuture,并提供很好的分析。

因此,如果有人可以向我解释或指出这样的博客或文章,那对我来说真的很棒。

ListenableFutureCompletableFuture 都优于其父级 class Future 通过允许调用者以一种或另一种方式 "register" 在异步操作完成时调用回调。

使用 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())

当线程对任务调用 complete 时,如果任务尚未完成,则通过调用 get() 收到的值将设置为参数值。

Read about CompletableFuture

Guava AbstractFuture 有其局限性:

  1. Listener 是列表,但通常只使用 1 个 - 矫枉过正。如果需要多个监听器,在下一阶段处理,或者考虑消息传递。

  2. setException 将 return 值设置为 Exception,因此用户必须像 guava AbstractFuture 那样在 get() 处使用 instanceof 来区分 Exception 与否。

  3. 在 Future 管道中,层数过多addListener() 代码难以阅读。

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