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.
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.