簡體   English   中英

使用CompletableFuture回調對性能有好處嗎?

[英]Is there a performance benefit of using CompletableFuture callbacks?

CompletableFuture允許為異步調用提供回調。 您可以創建一長串回調,其中每個異步調用都會在完成時觸發下一個回調。 這被認為是編寫異步代碼的一種更好的方法,而不是使用Future,因為您在觸發下一個之前,必須阻塞線程以獲取第一次計算的結果。

我可以理解以下觀點,即Completable Futures中的回調鏈可以提供更具可讀性的代碼,但是我想知道這種方法是否還具有性能優勢,還是僅是語法糖?

例如,考慮以下代碼:

    ExecutorService exec = Executors.newSingleThreadExecutor();
    CompletableFuture.supplyAsync(this::findAccountNumber, exec)
                     .thenApply(this::calculateBalance)
                     .thenApply(this::notifyBalance)
                     .thenAccept((i)->notifyByEmail())
                     .join();

在這段代碼中,在findAccountNumber()完成之前, calculateBalance()無法啟動,因此從本質上來說, calculateBalance()findAccountNumber()上被阻塞,依此類推,對於回調鏈中的下一方法。 它比以下(性能方面)如何更好:

    ExecutorService exec = Executors.newSingleThreadExecutor();
    Future<Integer> accountNumberFuture = exec.submit(findAccountNumberCallable);
    Integer accountNumber = accountNumberFuture.get();
    Future<String> calculateBalanceFuture = exec.submit(calculateBalanceCallable(accountNumber);
    ....
    ....

在大多數情況下,您不會注意到有什么不同,但是如果您希望能夠有很多並發的異步調用等待某事,則可以使用CompletableFuture

原因是,如果您僅在常規Future上調用get() ,則Thread及其所有相關資源將被阻塞,直到調用返回。 如果有許多調用,則線程池可能會用盡,或者如果使用CachedThreadPool ,則可能會導致創建許多線程。

使用CompletableFuture ,對象將存儲在堆上,該對象表示應用程序接下來應從何處開始,而不是使用調用堆棧。 構建API的人在這里進行了討論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM