成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Java CompletableFuture的使用詳解

瀏覽:116日期:2022-08-15 14:58:27
CompletableFuture​

它代表某個同步或異步計算的一個階段。你可以把它理解為是一個為了產生有價值最終結果的計算的流水線上的一個單元。這意味著多個指令可以鏈接起來從而一個階段的完成可以觸發(fā)下一個階段的執(zhí)行。

任務開啟

supplyAsync 開啟一個子線程去執(zhí)行有返回結果

開啟一個子線程用來執(zhí)行執(zhí)行事務,可以通過返回值的join來得到返回值.

例如:

print('去煮飯了');CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> { print('煮飯中....'); sleep(); sleep(); sleep(); print('煮飯完成'); return '盛米飯';});sleep();print('炒完菜了');sleep();print(completableFuture.join()+'!開吃');

返回結果:

Java CompletableFuture的使用詳解

runAsync 開啟一個子線程去執(zhí)行無結果

任務結束

getjoin 獲得返回值

join 隱性拋出異常、get顯性拋出異常

Stopwatch stopwatch = Stopwatch.createStarted();CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 16 / 2);CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 27 / 3);try { Assertions.assertEquals(future1.get(),8);} catch (InterruptedException e) { e.printStackTrace();} catch (ExecutionException e) { e.printStackTrace();}Assertions.assertEquals(future2.join(),9);串行任務thenApplythenApplyAsync 串行將異步結果進行同步異步的處理

​ 在當前階段正常執(zhí)行完成后(正常執(zhí)行是指沒有拋出異常)對前者的結果進行的操作。

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 16 / 2).thenApply(t1 -> t1*2);Assertions.assertEquals(future.join(),16);handlehandleAsync 允許有異常的情況下任然進行異步任務執(zhí)行

​ handle方法和 thenApply方法處理方式基本一樣。不同的是 handle是在任務完成后再執(zhí)行,還可以處理異常的任務。thenApply只可以執(zhí)行正常的任務,任務出現(xiàn)異常則不執(zhí)行 thenApply方法。

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 16 / 0).handle((t1, e) -> { System.out.println('handle=' + e.getMessage()); return Integer.MAX_VALUE;});Assertions.assertEquals(future.join(),Integer.MAX_VALUE);thenAcceptthenAcceptAsync 同步異步穿行消費前任務無返回結果

CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> getRemoteUser(familyName)).thenAccept(list -> list.forEach(System.out::println));System.out.println(String.format('總執(zhí)行耗時[%d]毫秒', stopwatch.elapsed(TimeUnit.MILLISECONDS)));future.join();thenRunthenRunAsync 不關注前任務的執(zhí)行結果

不關心任務的處理結果。只要上面的任務正確的執(zhí)行完成,就開始執(zhí)行。同樣其也無返回值

CompletableFuture future = CompletableFuture.supplyAsync(() -> 12 / 1).thenRun(() -> System.out.println('無返回值的執(zhí)行')); System.out.println(future.join());thenComposethenComposeAsync 允許多個任務Future流水線執(zhí)行

​ 允許你對兩個任務進行流水線操作,第一個操作完成時,將其結果作為參數(shù)傳遞給第二個操作。你可以將多個任務嵌套的進行見例2

例1:

print('去煮飯了');CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> { print('煮飯中....'); sleep(); sleep(); print('煮飯完成'); return '米飯';}).thenCompose(rice -> CompletableFuture.supplyAsync(() ->{ print('洗碗'); sleep(); print('洗碗洗完了'); return rice+'盛好了';}));sleep();print('炒完菜了');print(completableFuture.join()+'!開吃');

返回結果:

Java CompletableFuture的使用詳解

例2:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 16 / 2) .thenComposeAsync(t1 -> CompletableFuture.supplyAsync(() -> t1 / 2) .thenComposeAsync(t2 -> CompletableFuture.supplyAsync(() -> t2 / 2)));Assertions.assertEquals(future.join(),2);

結論:可以看出supplyAsync執(zhí)行了異步方法,thenCompose將上一個異步的結果(文中的rice)拿到以后通過一個線程去執(zhí)行了當前異步任務,并將結果在future.join()中輸出了。

whenCompletewhenCompleteAsync 串行將異步結果進行同步異步的處理

​ 與thenAccept很像,區(qū)別在于whenComplete的執(zhí)行會將前任務的返回結果給返回而thenAccept無返回結果。

//whenCompleteCompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 16 / 2);CompletableFuture<Integer> future = future1.whenComplete((t1, e) -> { Assertions.assertEquals(Thread.currentThread().getName(),'main'); Assertions.assertEquals(t1, 8); Assertions.assertNull(e); t1 = 10;});Assertions.assertEquals(future.join(), 8);//thenAcceptCompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 16 / 2);CompletableFuture<Void> future3 = future2.thenAccept(t1 -> { Assertions.assertEquals(Thread.currentThread().getName(), 'main'); Assertions.assertEquals(t1, 8);});Assertions.assertNull(future3.join());//thenApplyCompletableFuture<Integer> future4 = CompletableFuture.supplyAsync(() -> 16 / 2);CompletableFuture<Integer> future5 = future4.thenApply(t1 -> { Assertions.assertEquals(Thread.currentThread().getName(), 'main'); Assertions.assertEquals(t1, 8); return t1*2;});Assertions.assertEquals(future5.join(),16);System.out.println('------OK-------');并行任務thenCombine 并列多任務執(zhí)行并結果匯總​

同時執(zhí)行兩個異步任務,并且在最后通過BiFunction將兩個結果綜合起來進行結果輸出.

例如:

print('去煮飯了');CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> { print('煮飯中....'); sleep(); sleep(); print('煮飯完成'); return '米飯';}).thenCombine(CompletableFuture.supplyAsync(() ->{ print('洗碗'); sleep(); print('洗碗洗完了'); return '碗好了';}),(rice,bowl) -> { print('盛個飯'); return '盛個飯';});sleep();print('炒完菜了');print(completableFuture.join()+'!開吃');

返回結果:

Java CompletableFuture的使用詳解

結論:可以看出supplyAsync執(zhí)行了異步方法,thenCombine又起了一個新的線程并把兩者的結果綜合到一起(rice/bowl),由BiFunction進行計算,并將結果在future.join()中輸出了。

thenAcceptBoththenAcceptBothAsync 并列多任務執(zhí)行并消費結果無返回值

與thenCombine差不多,區(qū)別是thenAcceptBoth無返回值

CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 16 / 2).thenApply(t1 -> t1/2);CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 27 / 3).thenApply(t1 -> t1/3);CompletableFuture<Void> completableFuture = future1.thenAcceptBoth(future2, (t1, t2) -> { Assertions.assertEquals(t1 + t2, 7);});completableFuture.join();applyToEitherapplyToEitherAsync 兩個任務并行進行用快的那個的結果作為后續(xù)處理

​ 兩個任務,誰執(zhí)行返回的結果快,我就用那個任務的結果進行下一步的操作。

Stopwatch stopwatch = Stopwatch.createStarted();CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> { sleep(Integer.MAX_VALUE); return 16 / 2;});CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 27 / 3);CompletableFuture<Integer> future = future1.applyToEither(future2, t -> t);Assertions.assertEquals(future.join(),9);Assertions.assertTrue(stopwatch.elapsed(TimeUnit.MILLISECONDS) < 1000);runAfterBoth/runAfterBothAsync 兩個任務都完成了不關注執(zhí)行結果的進行下一步操作

Stopwatch stopwatch = Stopwatch.createStarted();CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> { sleep(2000); return 16 / 2;});CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 27 / 3);CompletableFuture<Void> future = future1.runAfterBothAsync(future2,() -> System.out.println('1234'));future.join();Assertions.assertTrue(stopwatch.elapsed(TimeUnit.MILLISECONDS) > 2000);

以上就是Java CompletableFuture的使用詳解的詳細內容,更多關于Java CompletableFuture的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
97精品视频在线观看自产线路二| 亚洲一区激情| 亚洲一区日本| 国产精品视频第一区| 国产99久久精品| 欧美精品丝袜久久久中文字幕| 日韩av一级电影| 久久亚洲二区| 午夜精品国产更新| 亚洲一区二区三区色| 一区二区三区四区激情| 亚洲国产精品www| 中文字幕一区二区三区视频| 韩国一区二区三区在线观看| 中文在线一区二区| 亚洲性图久久| 91欧美一区二区| 91国产免费观看| 亚洲精品视频观看| 欧美一区二区三区在线免费观看 | 狠狠色丁香婷婷综合久久片| 欧美自拍偷拍午夜视频| 日本伊人色综合网| 欧美优质美女网站| 九色综合国产一区二区三区| 欧美高清你懂得| 国产福利一区二区三区视频在线 | 亚洲中字在线| 日韩专区一卡二卡| 在线影院国内精品| 国产麻豆欧美日韩一区| 日韩精品一区二区三区视频| 99re6这里只有精品视频在线观看| 国产婷婷一区二区| 伊人成人在线| 亚洲一区在线观看网站| 色诱视频网站一区| 国产主播一区二区三区| 日韩午夜电影av| 女女同性女同一区二区三区91| 久久久91精品国产一区二区精品 | 91福利在线观看| 国产美女娇喘av呻吟久久| 精品久久久久久综合日本欧美| 色综合天天综合网国产成人综合天 | 99精品国产热久久91蜜凸| 国产目拍亚洲精品99久久精品| 黄色成人精品网站| 亚洲综合无码一区二区| 色综合久久88色综合天天| 国产三区在线成人av| 亚洲成人免费看| 久久九九精品| 欧美aaaaa成人免费观看视频| 欧美性大战xxxxx久久久| 免费看日韩a级影片| 在线免费亚洲电影| 精品粉嫩超白一线天av| 国内精品伊人久久久久av一坑| 亚洲精品一区二区三区在线观看| 亚洲视频中文| 亚洲成人精品一区| 欧美精品久久久久久久久老牛影院| 成人高清免费在线播放| 国产精品久久久久一区二区三区 | 久久99久国产精品黄毛片色诱| 欧美岛国在线观看| 韩日视频一区| 蜜臀va亚洲va欧美va天堂| 精品国产乱码久久久久久浪潮| 99成人精品| 国产精品一区三区| 国产欧美一区二区精品秋霞影院| 国产精品久久波多野结衣| 国产最新精品免费| 国产精品午夜久久| 性色av一区二区怡红| 国产精品亚洲第一区在线暖暖韩国 | 精品三级av在线| 国产精品乱码| 国产999精品久久久久久| 国产精品久久久久久久久免费桃花 | 亚洲综合在线电影| 欧美精品久久99久久在免费线| 99久久伊人精品| 亚洲伊人伊色伊影伊综合网| 欧美夫妻性生活| 亚洲一级电影| 久久99精品久久只有精品| 国产精品久久一级| 欧美日韩视频不卡| 精品96久久久久久中文字幕无| 2023国产一二三区日本精品2022| 青草国产精品久久久久久| 欧美日韩三级在线| 91亚洲国产成人精品一区二区三| 国产精品乱人伦中文| 国产深夜精品| 久久精品国产精品亚洲综合| 欧美一区二区三区日韩视频| 欧美日韩一区二区三区四区在线观看| 一片黄亚洲嫩模| 在线电影欧美成精品| 午夜天堂精品久久久久| 亚洲男人的天堂在线观看| 91豆麻精品91久久久久久| 成人激情动漫在线观看| 中文字幕免费在线观看视频一区| 亚洲一区二区三区免费观看| 狠狠色丁香婷婷综合久久片| 日本一区二区久久| 老鸭窝91久久精品色噜噜导演| 精品影视av免费| 国产午夜精品久久久久久久| 久久精品30| 成人免费视频caoporn| 亚洲天堂2016| 欧美日韩在线电影| 黑人一区二区| 老司机午夜精品| 国产精品欧美经典| 欧美系列在线观看| 午夜精品影院| 日本伊人午夜精品| 欧美国产亚洲另类动漫| 色婷婷综合久久久| 成人黄色电影在线 | 国产欧美日韩在线播放| 国产suv一区二区三区88区| 亚洲欧美欧美一区二区三区| 欧美色中文字幕| 国产在线成人| 国产一区二区三区四区五区入口| 自拍偷拍欧美精品| 91精品国产麻豆国产自产在线| 黑丝一区二区三区| 国产在线播放一区| 亚洲精品视频免费观看| 欧美大片国产精品| 久久久久久九九九九| 牛牛国产精品| 国产一区二区三区久久久| 亚洲欧美电影一区二区| 538prom精品视频线放| 一本久道久久综合狠狠爱| 国产成人精品午夜视频免费| 亚洲综合偷拍欧美一区色| 久久久精品免费观看| 欧洲在线/亚洲| 精品9999| 成人黄色网址在线观看| 午夜精品在线视频一区| 久久久久国产成人精品亚洲午夜| 色美美综合视频| 136国产福利精品导航网址| 欧美伊人久久| 欧美一区成人| 欧美亚洲一区二区三区| 国产成人av自拍| 久久最新视频| 日本亚洲视频在线| 亚洲电影中文字幕在线观看| 亚洲色图丝袜美腿| 欧美国产日韩在线观看| 日韩欧美精品三级| 欧美麻豆精品久久久久久| 色综合久久88色综合天天6 | 亚洲高清视频的网址| 久久久www| 懂色av中文字幕一区二区三区| 老司机精品视频在线| 亚洲免费观看高清| 久久久久一区二区三区| 91免费视频观看| 亚洲国产精品99久久久久久久久 | 日韩一区二区在线免费观看| 欧美日本精品一区二区三区| 欧美三级日本三级少妇99| 欧美性生交片4| 欧洲精品在线观看| 欧美日韩综合色| 欧美一区二区视频免费观看| 欧美精品三级在线观看| 欧美日韩精品一区二区三区蜜桃 | 国产精品亚洲一区| 国产一区二区高清| 国产精品污网站| 日韩免费一区二区| 亚洲电影专区| 精品三级在线观看| 色爱区综合激月婷婷| 老司机午夜免费精品视频| 91国产免费观看| 欧美精品免费视频| 精品国产一区二区三区四区四| 欧美不卡视频一区| 久久久五月婷婷| 亚洲国产精品高清| 亚洲男女一区二区三区| 亚洲午夜久久久|