2016-08-03 96 views
17

我努力嘗試,但沒有找到明確比較「listenablefuture」和「completablefuture」的文章或博客,並提供了相同的分析。所以如果任何人能夠解釋或指向我這樣的博客或文章,那對我來說真的很好。謝謝Listenablefuture vs Completablefuture

回答

17

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()獲得的值將使用參數值設置。

Read about CompletableFuture

+1

換句話說...... ListenableFuture是一個深思熟慮的乾淨的界面,而CompletableFuture(和CompletionStage接口,因爲它暴露了'toCompletableFuture')是危險的,因爲它暴露了'complete'方法。又一個我們期待從Oracle那裏得到的未經深思熟慮的垃圾的例子。 –

+0

'CompletionStage'如果擴展'Future'並且不暴露'toCompletableFuture'會很好。然後他們可以將其命名爲「ChainableFuture」。 –

+2

'Future'和'ListenableFuture'是接口,而'CompletableFuture'是一個實現'Future'的類。 – cozyconemotel