Listenablefuture与Completablefuture

Ash*_*Jha 49 java completable-future

我努力,但没有发现任何文章或博客清楚地比较ListenableFutureCompletableFuture,并提供了一个很好的分析.

因此,如果有人能够解释或指向我这样的博客或文章,那对我来说真的很好.

小智 43

无论ListenableFutureCompletableFuture有超过它的父类的优势未来将允许当异步操作已经完成了这样或那样的回调调用者"登记"被调用.

有了Future,你可以这样做:

ExecutorService executor = ...;
Future f = executor.submit(...);
f.get();
Run Code Online (Sandbox Code Playgroud)

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
                }
            })
Run Code Online (Sandbox Code Playgroud)

使用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())
Run Code Online (Sandbox Code Playgroud)

当线程调用任务完成时,如果任务尚未完成,则使用参数值设置从get()调用接收的值.

阅读CompletableFuture

  • 换句话说...... ListenableFuture是一个经过深思熟虑的干净界面,而CompletableFuture(以及CompletionStage接口,因为它暴露了`toCompletableFuture`)是危险的,因为它暴露了`complete`方法.另一个我们期待从甲骨文那里得到的非常深思熟虑的垃圾的例子. (10认同)
  • `Future`和`ListenableFuture`是接口,而`CompletableFuture`是实现`Future`的类 (2认同)
  • @motaa 他们选择得不好。如果您只是包装“CompletableFuture”并覆盖它以在“toCompletableFuture”上抛出异常(正如您链接中的讨论所暗示的那样),那么流畅的方法就会中断,因为大多数流畅的方法实际上调用了“toCompletableFuture”方法来完成它们的工作。`ListenableFuture` 的噪音要小得多,“危险”的东西也更少。 (2认同)