我正在向用戶回傳以下回復
class FinalResponseDTO {
List<Service1ResponseDTO> service1ResponseDTO;
Long totalCount;
List<Service2ResponseDTO> service2ResponseDTO;
}
到目前為止,我正在進行三個連續呼叫來計算 this FinalResponseDTO,每個呼叫都可以獨立于其他呼叫運行。我嘗試制作三個不同CompletableFuture的:
CompletableFuture<List<Service1ResponseDTO> future1 = CompletableFuture.supplyAsync(() -> service1.callMethod1());
CompletableFuture<Long> future2 = CompletableFuture.supplyAsync(() -> service2.callMethod2());
CompletableFuture<Service2ResponseDTO> future3 = CompletableFuture.supplyAsync(() -> service3.callMethod3());
如果我這樣做CompletableFuture.allOf(future1, future2, future3).join();還是應該打電話CompletableFuture.allOf(future1, future2, future3).get();?即使我呼叫其中任何一個,join或者get我應該如何FinalResponseDTO從中構建。我是 Java 8 并發特性的新手,CompletableFuture我很困惑,因為每個未來的每個回傳型別都是不同的,我應該如何獲得所有這些未來的組合回應,然后構造我的最終輸出?
uj5u.com熱心網友回復:
來自 Javadocs CompletableFuture.allOf():
當所有給定的 CompletableFuture 完成時,回傳一個新的 CompletableFuture。如果任何給定的 CompletableFuture 例外完成,則回傳的 CompletableFuture 也會這樣做,并且 CompletionException 將此例外作為其原因。否則,給定 CompletableFuture 的結果(如果有)不會反映在回傳的 CompletableFuture 中,但可以通過單獨檢查它們來獲得。
因此,當組合 CompletableFuture 完成時,您可以通過應用構造物件的函式來檢查值并使用簡單的建構式構造最終回應物件:
CompletableFuture.allOf(future1, future2, future3).thenApply(v ->
new FinalResponseDTO(future1.join(), future2.join(), future3.join())
);
uj5u.com熱心網友回復:
CompletableFuture<List<Service1ResponseDTO> future1 =
CompletableFuture.supplyAsync(() -> service1.callMethod1());
CompletableFuture<Long> future2 =
CompletableFuture.supplyAsync(() -> service2.callMethod2());
CompletableFuture<List<Service2ResponseDTO>> future3 =
CompletableFuture.supplyAsync(() -> service3.callMethod3());
CompletableFuture.allOf(future1, future2, future3).get();
return new FinalResponseDTO(future1.join(), future2.join(), future3.join());
注意:supplyAsync運行,ForkJoinPool.commonPool()因此提供您自己的執行程式是一個不錯的選擇,例如Executors.newCachedThreadPool():
CompletableFuture.supplyAsync(() -> action, executor);
uj5u.com熱心網友回復:
而不是使用CompletableFuture.allOf,您可以回退到有點隱藏的 Applicative CompletableFuture:
static <T, R> CompletableFuture<R> alsoApply(CompletableFuture<T> future, CompletableFuture<Function<T, R>> f) {
return f.thenCompose(future::thenApply);
}
使用此輔助函式,您可以在并行執行緒中執行期貨:
CompletableFuture<String> future = alsoApply(
CompletableFuture.supplyAsync(() -> "a"),
CompletableFuture.supplyAsync(() -> "b")
.thenApply(b -> a -> a b));
assertEquals("ab", future.get());
請參閱此問題和答案,了解它的來源以及它的作業原理和方式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/412305.html
標籤:
