79 votes

Listenablefuture vs Completablefuture

J'ai essayé mais je n'ai pas trouvé d'article ou de blog qui compare clairement ListenableFuture et CompletableFuture et fournit une bonne analyse.

Donc si quelqu'un peut m'expliquer ou m'indiquer un tel blog ou article, ce sera vraiment bien pour moi.

1 votes

Un blog de l'équipe gauva sur EcoutableFutur

75voto

Livia Moroianu Points 366

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

Avec Futur vous pouvez le faire :

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

f.get() se bloque jusqu'à ce que l'action asynchrone soit terminée ;

Avec EcoutableFutur vous pouvez enregistrer un callback comme ceci :

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 callback lorsque la tâche est terminée, mais elle est différente de ListenableFuture en ce sens qu'elle peut être terminée à partir de n'importe quel thread qui le souhaite.

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 complete sur la tâche, la valeur reçue d'un appel à get() est définie avec la valeur du paramètre si la tâche n'est pas déjà terminée.

Lisez sur CompletableFuture

22 votes

En d'autres termes... ListenableFuture est une interface propre et bien pensée, tandis que CompletableFuture (et l'interface CompletionStage puisqu'elle expose toCompletableFuture ) est dangereux car il expose complete méthodes. Encore un exemple des déchets pas très bien pensés que nous attendons d'Oracle.

0 votes

CompletionStage aurait été bien s'il avait été prolongé Future et n'a pas exposé toCompletableFuture . Et ils auraient alors pu lui donner un nom significatif, comme "ChainableFuture".

6 votes

Future y ListenableFuture sont des interfaces tandis que CompletableFuture est une classe qui implémente Future

-1voto

simple Points 1

L'AbstractFuture de Guava a ses limites :

  1. L'écouteur est une liste, mais il n'est généralement utilisé qu'une seule fois - ce qui est excessif. Si plusieurs listeners sont nécessaires, il faut les gérer dans l'étape suivante, ou penser à la messagerie.

  2. setException définit la valeur de retour comme Exception, donc l'utilisateur doit utiliser instanceof pour différencier Exception ou pas à get() comme l'a fait guava AbstractFuture.

  3. Dans le pipeline Future, trop de couches addListener() rendre le code difficile à lire.

Je préfère CompletableFuture.supply().thenApply().thenAccept().handle()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X