2016-08-03 2 views
17

J'ai essayé dur mais n'ai trouvé aucun article ou blog qui compare clairement "listenablefuture" et "completablefuture", et fournit une bonne analyse de la même chose. Donc, si quelqu'un peut m'expliquer ou me diriger vers un tel blog ou article, ce sera vraiment bon pour moi.Listenablefuture vs Completablefuture

Répondre

17

ListenableFuture et CompletableFuture ont tous les deux un avantage sur leur classe parente Future en permettant à l'appelant d'enregistrer d'une manière ou d'une autre un rappel à appeler lorsque l'action asynchrone est terminée.

Avec Future vous pouvez le faire:

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

blocs f.get() jusqu'à ce que l'action async est terminée;

Avec ListenableFuture vous pouvez enregistrer un rappel comme celui-ci:

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

Avec CompletableFuture vous pouvez également enregistrer un rappel lorsque la tâche est terminée, mais il est différent de ListenableFuture en ce qu'elle peut être complété à partir de n'importe quel fil qui le veut compléter.

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

Lorsqu'un thread appelle complet sur la tâche, la valeur reçue d'un appel à get() est défini avec la valeur du paramètre si la tâche n'est pas déjà terminée.

Read about CompletableFuture

+1

En d'autres termes ... ListenableFuture est un bien pensé interface propre, tout en CompletableFuture (et l'interface CompletionStage car il expose 'toCompletableFuture') est dangereuse, car elle expose les méthodes' complete'. Encore un autre exemple de la poubelle pas très bien pensée que nous attendons d'Oracle. –

+0

'CompletionStage' aurait été bon s'il étendait' Future' et n'exposait pas 'toCompletableFuture'. Et puis ils auraient pu l'appeler quelque chose de significatif, comme "ChainableFuture". –

+2

'Future' et' ListenableFuture' sont des interfaces alors que 'CompletableFuture' est une classe qui implémente' Future' – cozyconemotel