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
1 votes
Un blog de l'équipe gauva sur EcoutableFutur