17
我努力嘗試,但沒有找到明確比較「listenablefuture」和「completablefuture」的文章或博客,並提供了相同的分析。所以如果任何人能夠解釋或指向我這樣的博客或文章,那對我來說真的很好。謝謝Listenablefuture vs Completablefuture
我努力嘗試,但沒有找到明確比較「listenablefuture」和「completablefuture」的文章或博客,並提供了相同的分析。所以如果任何人能夠解釋或指向我這樣的博客或文章,那對我來說真的很好。謝謝Listenablefuture vs Completablefuture
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()獲得的值將使用參數值設置。
換句話說...... ListenableFuture是一個深思熟慮的乾淨的界面,而CompletableFuture(和CompletionStage接口,因爲它暴露了'toCompletableFuture')是危險的,因爲它暴露了'complete'方法。又一個我們期待從Oracle那裏得到的未經深思熟慮的垃圾的例子。 –
'CompletionStage'如果擴展'Future'並且不暴露'toCompletableFuture'會很好。然後他們可以將其命名爲「ChainableFuture」。 –
'Future'和'ListenableFuture'是接口,而'CompletableFuture'是一個實現'Future'的類。 – cozyconemotel