日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CompletableFuture详解~allOf

發布時間:2024/7/23 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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(),我們打印出每個汽車和它的評分。

  • cars().thenCompose(cars -> {List<CompletionStage> updatedCars = cars.stream().map(car -> rating(car.manufacturerId).thenApply(r -> {car.setRating(r);return car;})).collect(Collectors.toList());CompletableFuture done = CompletableFuture.allOf(updatedCars.toArray(new CompletableFuture[updatedCars.size()]));return done.thenApply(v -> updatedCars.stream().map(CompletionStage::toCompletableFuture).map(CompletableFuture::join).collect(Collectors.toList())); }).whenComplete((cars, th) -> {if (th == null) {cars.forEach(System.out::println);} else {throw new RuntimeException(th);} }).toCompletableFuture().join();

    因為每個汽車的實例都是獨立的,得到每個汽車的評分都可以異步地執行,這會提高系統的性能(延遲),而且,等待所有的汽車評分被處理使用的是allOf方法,而不是手工的線程等待(Thread#join() 或 a CountDownLatch)。

    總結

    以上是生活随笔為你收集整理的CompletableFuture详解~allOf的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。