Próbowałem mocno, ale nie znalazłem żadnego artykułu lub bloga, który wyraźnie porównuje "listenablefuture" i "completablefuture", i zapewnia dobrą analizę tego samego. Jeśli więc ktoś może mi wytłumaczyć lub wskazać taki blog lub artykuł, będzie to dla mnie naprawdę dobre. dziękiListenablefuture vs Completablefuture
Odpowiedz
Zarówno ListenableFuture, jak i CompletableFuture mają przewagę nad swoją klasą macierzystą Future, umożliwiając dzwoniącemu "zarejestrowanie" w ten czy inny sposób wywołania zwrotnego, które ma zostać wywołane, gdy akcja asynchroniczna została zakończona.
Z Future można to zrobić:
ExecutorService executor = ...;
Future f = executor.submit(...);
f.get();
f.get() blokuje aż zostanie zakończona akcja asynchroniczny;
Z ListenableFuture można zarejestrować wywołania zwrotnego takiego:
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
}
})
Z CompletableFuture można również zarejestrować wywołania zwrotnego dla kiedy zadanie jest kompletna, ale różni się ona od ListenableFuture tym, że można ukończyć z dowolnego wątku, który chce go ukończyć.
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())
Gdy wątek wywołuje kompletny na zadaniu, wartość otrzymanych z wywołania get() jest ustawiona z wartością parametru jeśli zadanie nie zostało jeszcze zakończone.
Innymi słowy ... ListenableFuture jest dobrze przemyślane przejrzysty interfejs, a CompletableFuture (a interfejs CompletionStage ponieważ naraża 'toCompletableFuture') jest niebezpieczne, ponieważ naraża' metody complete'. Jeszcze jeden przykład niezbyt dobrze przemyślanych śmieci, jakich oczekujemy od Oracle. –
'CompletionStage' byłoby dobrze, gdyby rozszerzyło' Future' i nie naraziło 'toCompletableFuture'. A potem mogliby nazwać to czymś znaczącym, np. "ChainableFuture". –
'Future' i' ListenableFuture' to interfejsy, podczas gdy 'CompletableFuture' to klasa implementująca' Future' – cozyconemotel