web-dev-qa-db-fra.com

Listenablefuture vs Completablefuture

J'ai fait de gros efforts, mais je n'ai trouvé aucun article ou blog qui compare clairement ListenableFuture et CompletableFuture, et fournit une bonne analyse.

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

44
Ashutosh Jha

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

Avec Future vous pouvez faire ceci:

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

f.get() est bloqué jusqu'à la fin de l'action asynchrone.

Avec ListenableFuture , vous pouvez enregistrer un rappel 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 rappel lorsque la tâche est terminée, mais il est différent de ListenableFuture en ce sens qu'il peut être complété à 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 se termine 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 encore terminée.

Lisez à propos de CompletableFuture

38
Livia Moroianu