CompletableFuture详解~allOf
當所有的階段都完成后創建一個階段
上一個例子是當任意一個階段完成后接著處理,接下來的兩個例子演示當所有的階段完成后才繼續處理, 同步地方式和異步地方式兩種。
static void allOfExample() {StringBuilder result = new StringBuilder();List messages = Arrays.asList("a", "b", "c");List<CompletableFuture> futures = messages.stream().map(msg -> CompletableFuture.completedFuture(msg).thenApply(s -> delayedUpperCase(s))).collect(Collectors.toList());CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).whenComplete((v, th) -> {futures.forEach(cf -> assertTrue(isUpperCase(cf.getNow(null))));result.append("done");});assertTrue("Result was empty", result.length() > 0); }當所有的階段都完成后異步地創建一個階段
使用thenApplyAsync()替換那些單個的CompletableFutures的方法,allOf()會在通用池中的線程中異步地執行。所以我們需要調用join方法等待它完成。
static void allOfAsyncExample() {StringBuilder result = new StringBuilder();List messages = Arrays.asList("a", "b", "c");List<CompletableFuture> futures = messages.stream().map(msg -> CompletableFuture.completedFuture(msg).thenApplyAsync(s -> delayedUpperCase(s))).collect(Collectors.toList());CompletableFuture allOf = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).whenComplete((v, th) -> {futures.forEach(cf -> assertTrue(isUpperCase(cf.getNow(null))));result.append("done");});allOf.join();assertTrue("Result was empty", result.length() > 0); }真實的例子
現在你已經了解了CompletionStage 和 CompletableFuture 的一些函數的功能,下面的例子是一個實踐場景:
首先異步調用cars方法獲得Car的列表,它返回CompletionStage場景。cars消費一個遠程的REST API。
然后我們復合一個CompletionStage填寫每個汽車的評分,通過rating(manufacturerId)返回一個CompletionStage, 它會異步地獲取汽車的評分(可能又是一個REST API調用)
當所有的汽車填好評分后,我們結束這個列表,所以我們調用allOf得到最終的階段, 它在前面階段所有階段完成后才完成。
在最終的階段調用whenComplete(),我們打印出每個汽車和它的評分。
因為每個汽車的實例都是獨立的,得到每個汽車的評分都可以異步地執行,這會提高系統的性能(延遲),而且,等待所有的汽車評分被處理使用的是allOf方法,而不是手工的線程等待(Thread#join() 或 a CountDownLatch)。
總結
以上是生活随笔為你收集整理的CompletableFuture详解~allOf的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大话设计模式-策略模式与简单工厂模式
- 下一篇: RabbitMQ从入门到精通