Listenablefuture против Completablefuture
Я старался, но не нашел никакой статьи или блога, который четко сравнивает ListenableFuture
и CompletableFuture
, и обеспечивает хороший анализ.
поэтому, если кто-нибудь может объяснить или указать мне на такой блог или статью, это будет действительно хорошо для меня.
1 ответов
как ListenableFuture, так и CompletableFuture имеют преимущество перед своим родительским классом Future, позволяя вызывающему объекту так или иначе "регистрировать" обратный вызов, который будет вызван после завершения асинхронного действия.
С будущее можно сделать так:
ExecutorService executor = ...;
Future f = executor.submit(...);
f.get();
f.get () блокирует до завершения асинхронного действия;
С ListenableFuture вы можете зарегистрировать обратный вызов следующим образом:
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
}
})
С CompletableFuture вы также можете зарегистрировать обратный вызов, когда задача завершена, но она отличается от ListenableFuture тем, что ее можно выполнить из любого потока, который хочет ее завершить.
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())
когда поток вызывает завершение задачи, значение, полученное от вызова get (), устанавливается со значением параметра, если задача еще не завершена.