[英]Is there any performance benefit by using readOnly in hibernate criteria?
[英]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.