2016-08-03 9 views
17

私は頑張ったが、 "listenablefuture"と "completablefuture"をはっきりと比較した記事やブログは見つからなかった。だから、もし誰かが私にそのようなブログや記事を説明したり指摘したりすることができれば、それは本当に良いことになるだろう。ありがとうListenablefuture対Completablefuture

答えて

17

ListenableFutureとCompletableFutureの両方とも、呼び出し側が非同期アクションが完了したときに呼び出されるコールバックを一方向または他の方法で「登録」できるようにすることで、親クラスFutureより優れています。 将来性の

あなたはこれを行うことができます。

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

f.getを()ブロックの非同期動作が完了するまで、あなたはこのようなコールバック登録できListenableFuture

:CompletableFuture

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 
       } 
      }) 

をあなたも タスクが完了したときのコールバックを登録することができますが、それはそのことに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

CompletableFutureそれは 'complete'メソッドを公開するので危険である(とCompletionStageインタフェースは、それは' toCompletableFuture'が公開するので)ながら... ListenableFutureは、考え抜かれたクリーンなインターフェイスです。私たちがオラクルから期待している非常によく考えられたゴミのもう一つの例です。 –

+0

'CompletionStage'は' Future'を拡張し、 'toCompletableFuture'を公開していないと良いでしょう。そして、「ChainableFuture」のように意味のあるものに名前をつけることができました。 –

+2

'Future'と' ListenableFuture'はインタフェースですが、 'CompletableFuture'は' Future'を実装するクラスです – cozyconemotel

関連する問題