精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

CompletableFuture真香,可以替代CountDownLatch!

開發(fā) 前端
Future相當(dāng)于一個占位符,代表一個操作將來的結(jié)果。一般通過get可以直接阻塞得到結(jié)果,或者讓它異步執(zhí)行然后通過callback回調(diào)結(jié)果。

[[420499]]

在對類的命名這篇長文中,我們提到了Future和Promise。

Future相當(dāng)于一個占位符,代表一個操作將來的結(jié)果。一般通過get可以直接阻塞得到結(jié)果,或者讓它異步執(zhí)行然后通過callback回調(diào)結(jié)果。

但如果回調(diào)中嵌入了回調(diào)呢?如果層次很深,就是回調(diào)地獄。Java中的CompletableFuture其實就是Promise,用來解決回調(diào)地獄問題。Promise是為了讓代碼變得優(yōu)美而存在的。

有多優(yōu)美?這么說吧,一旦你使用了CompletableFuture,就會愛不釋手,就像初戀女友一樣,天天想著她。

一系列靜態(tài)方法

從它的源代碼中,我們可以看到,CompletableFuture直接提供了幾個便捷的靜態(tài)方法入口。其中有run和supply兩組。

run的參數(shù)是Runnable,而supply的參數(shù)是Supplier。前者沒有返回值,而后者有,否則沒有什么兩樣。

這兩組靜態(tài)函數(shù),都提供了傳入自定義線程池的功能。如果你用的不是外置的線程池,那么它就會使用默認(rèn)的ForkJoin線程池。默認(rèn)的線程池,大小和用途你是控制不了的,所以還是建議自己傳遞一個。

典型的代碼,寫起來是這個樣子。

  1. CompletableFuture<String> future = CompletableFuture.supplyAsync(()->{ 
  2.  return "test"
  3. }); 
  4. String result = future.join(); 

拿到CompletableFuture后,你就可以做更多的花樣。

這些花樣有很多

我們說面說了,CompletableFuture的主要作用,就是讓代碼寫起來好看。配合Java8之后的stream流,可以把整個計算過程抽象成一個流。前面任務(wù)的計算結(jié)果,可以直接作為后面任務(wù)的輸入,就像是管道一樣。

  1. thenApply 
  2. thenApplyAsync 
  3. thenAccept 
  4. thenAcceptAsync 
  5. thenRun 
  6. thenRunAsync 
  7. thenCombine 
  8. thenCombineAsync 
  9. thenCompose 
  10. thenComposeAsync 

比如,下面代碼的執(zhí)行結(jié)果是99,并不因為是異步就打亂代碼執(zhí)行的順序了。

  1. CompletableFuture<Integer> cf = CompletableFuture.supplyAsync(() -> 10) 
  2.                 .thenApplyAsync((e) -> { 
  3.                     try { 
  4.                         Thread.sleep(10000); 
  5.                     } catch (InterruptedException ex) { 
  6.                         ex.printStackTrace(); 
  7.                     } 
  8.                     return e * 10; 
  9.                 }).thenApplyAsync(e -> e - 1); 
  10.  
  11. cf.join(); 
  12. System.out.println(cf.get()); 

同樣的,函數(shù)的作用還要看then后面的動詞。

  • apply 有入?yún)⒑头祷刂担雲(yún)榍爸萌蝿?wù)的輸出
  • accept 有入?yún)o返回值,會返回CompletableFuture
  • run 沒有入?yún)⒁矝]有返回值,同樣會返回CompletableFuture
  • combine 形成一個復(fù)合的結(jié)構(gòu),連接兩個CompletableFuture,并將它們的2個輸出結(jié)果,作為combine的輸入
  • compose 將嵌套的CompletableFuture平鋪開,用來串聯(lián)兩個CompletableFuture

when和handle

上面的函數(shù)列表,其實還有很多。比如:

  1. whenComplete 

when的意思,就是任務(wù)完成時候的回調(diào)。比如我們上面的例子,打算在完成任務(wù)后,輸出一個done。它也是屬于只有入?yún)]有出參的范疇,適合放在最后一步進(jìn)行觀測。

  1. CompletableFuture<Integer> cf = CompletableFuture.supplyAsync(() -> 10) 
  2.                 .thenApplyAsync((e) -> { 
  3.                     try { 
  4.                         Thread.sleep(1000); 
  5.                     } catch (InterruptedException ex) { 
  6.                         ex.printStackTrace(); 
  7.                     } 
  8.                     return e * 10; 
  9.                 }).thenApplyAsync(e -> e - 1) 
  10.                 .whenComplete((r, e)->{ 
  11.                     System.out.println("done"); 
  12.                 }) 
  13.                 ; 
  14.  
  15. cf.join(); 
  16. System.out.println(cf.get()); 

handle和exceptionally的作用,和whenComplete是非常像的。

  1. public CompletableFuture<T> exceptionally(Function<Throwable, ? extends T> fn); 
  2.  
  3. public <U> CompletionStage<U> handle(BiFunction<? super T, Throwable, ? extends U> fn); 

CompletableFuture的任務(wù)是串聯(lián)的,如果它的其中某一步驟發(fā)生了異常,會影響后續(xù)代碼的運(yùn)行的。

exceptionally從名字就可以看出,是專門處理這種情況的。比如,我們強(qiáng)制某個步驟除以0,發(fā)生異常,捕獲后返回-1,它將能夠繼續(xù)運(yùn)行。

  1. CompletableFuture<Integer> cf = CompletableFuture.supplyAsync(() -> 10) 
  2.                 .thenApplyAsync(e->e/0) 
  3.                 .thenApplyAsync(e -> e - 1) 
  4.                 .exceptionally(ex->{ 
  5.                     System.out.println(ex); 
  6.                     return -1; 
  7.                 }); 
  8.  
  9. cf.join(); 
  10. System.out.println(cf.get()); 

handle更加高級一些,因為它除了一個異常參數(shù),還有一個正常的入?yún)ⅰL幚矸椒ㄒ捕碱愃疲辉儋樖觥?/p>

當(dāng)然,CompletableFuture的函數(shù)不僅僅這些,還有更多,根據(jù)函數(shù)名稱很容易能夠了解到它的作用。它還可以替換復(fù)雜的CountDownLatch,這要涉及到幾個比較難搞的函數(shù)。

替代CountDownLatch

考慮下面一個場景。某一個業(yè)務(wù)接口,需要處理幾百個請求,請求之后再把這些結(jié)果給匯總起來。

如果順序執(zhí)行的話,假設(shè)每個接口耗時100ms,那么100個接口,耗時就需要10秒。假如我們并行去獲取的話,那么效率就會提高。

使用CountDownLatch可以解決。

  1. ExecutorService executor = Executors.newFixedThreadPool(5); 
  2.  
  3. CountDownLatch countDown = new CountDownLatch(requests.size()); 
  4. for(Request request:requests){ 
  5.     executor.execute(()->{ 
  6.         try{ 
  7.         //some opts 
  8.         }finally{ 
  9.             countDown.countDown(); 
  10.         } 
  11.     }); 
  12. countDown.await(200,TimeUnit.MILLISECONDS); 

我們使用CompletableFuture來替換它。

  1. ExecutorService executor = Executors.newFixedThreadPool(5); 
  2.  
  3. List<CompletableFuture<Result>> futureList = requests 
  4.     .stream() 
  5.     .map(request-> 
  6.         CompletableFuture.supplyAsync(e->{ 
  7.             //some opts 
  8.         },executor)) 
  9.     .collect(Collectors.toList()); 
  10.  
  11. CompletableFuture<Void> allCF = CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0])); 
  12.  
  13. allCF.join(); 

我們這里用到了一個主要的函數(shù),那就是allOf,用來把所有的CompletableFuture組合在一起;類似的還有anyOf,表示只運(yùn)行其中一個。常用的,還有三個函數(shù):

  • thenAcceptBoth 處理兩個任務(wù)的情況,有兩個任務(wù)結(jié)果入?yún)ⅲ瑹o返回值
  • thenCombine 處理兩個任務(wù)的情況,有入?yún)⒂蟹祷刂担钕矚g
  • runAfterBoth 處理兩個任務(wù)的情況,無入?yún)ⅲ瑹o返回值

End

自從認(rèn)識了CompletableFuture,我已經(jīng)很少硬編碼Future了。相對于各種回調(diào)的嵌套,CompletableFuture為我們提供了更直觀、更優(yōu)美的API。在“多個任務(wù)等待完成狀態(tài)”這個應(yīng)用場景,CompletableFuture已經(jīng)成了我的首選。

唯一的問題是,它的函數(shù)有點多,你需要熟悉一小段時間。另外,有一個小小的問題,個人覺得,這個類如果叫做Promise的話,就能夠和JS的統(tǒng)一起來,算是錦上添花吧。

 

作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。

 

責(zé)任編輯:武曉燕 來源: 小姐姐味道
相關(guān)推薦

2022-08-14 22:35:37

EurekaConsul

2017-12-21 15:48:11

JavaCompletable

2024-01-11 12:14:31

Async線程池任務(wù)

2025-02-28 09:20:00

Future開發(fā)代碼

2014-11-28 16:04:36

浪潮

2014-02-21 15:17:23

云存儲Time Machin

2024-01-08 08:44:06

2025-08-26 02:25:00

2021-09-30 16:17:42

開源軟件視頻通話視頻會議

2024-10-29 09:32:33

VMwareGCPAWS

2021-06-06 16:56:49

異步編程Completable

2025-02-07 10:14:36

2021-06-30 09:20:18

NuShell工具Linux

2021-09-08 06:51:53

CountDownLa閉鎖源碼

2025-07-29 09:01:35

if-else代碼

2024-12-26 12:59:39

2024-11-13 15:09:57

Java線程開發(fā)

2023-12-25 09:51:13

性能測試

2024-04-02 09:40:39

多線程Java原子性

2009-05-21 13:25:50

.NETCountDownLa微軟
點贊
收藏

51CTO技術(shù)棧公眾號

成人午夜sm精品久久久久久久| 精品黑人一区二区三区在线观看| 国产精品一区二区av交换| 狠狠躁天天躁日日躁欧美| 日本黑人久久| 精品人妻伦一区二区三区久久| 亚洲激情精品| 在线视频欧美性高潮| 久久久久国产免费| 韩日一区二区| 亚洲成人自拍网| 日韩免费av电影| 性中国古装videossex| 久久一本综合频道| 欧美国产日韩一区二区在线观看| 日韩乱码人妻无码中文字幕久久| 国产精品美女久久久久| 精品久久久视频| 在线码字幕一区| 视频一区二区三区国产| 国产在线不卡一区| 国产精品久久久久7777婷婷| 久久久美女视频| 日韩欧美三级| 日韩电影免费观看在线观看| 久久人人爽av| 国模冰冰炮一区二区| 亚洲精品一卡二卡| 亚洲精品视频一二三| 日韩在线观看视频一区| 国产在线不卡视频| 国产乱肥老妇国产一区二 | 国产97在线|亚洲| 精品无码久久久久久久久| 成人av二区| 日韩精品视频免费在线观看| 无人码人妻一区二区三区免费| 一根才成人网| 午夜成人在线视频| 国产一区二区三区乱码| 免费黄网在线观看| 中文字幕欧美日韩一区| 欧美二区在线看| 四虎永久在线观看| 9色porny自拍视频一区二区| av观看久久| av在线免费在线观看| 久久91精品国产91久久小草| 国产精品美女www| 在线永久看片免费的视频| 国产欧美三级| 3344国产精品免费看| 日韩高清精品免费观看| 国产精品www994| 色综合久久中文字幕综合网小说| jizz18女人高潮| 精品日韩欧美一区| 中文日韩在线视频| 1024在线看片| 天天射天天综合网| 成年人精品视频| 国产精品三区在线观看| 欧美99久久| 欧美激情奇米色| 国产中文字幕免费| 亚洲视频二区| 日本久久久a级免费| 中文字幕手机在线视频| 男人的天堂亚洲一区| 国产欧美日韩中文| av男人天堂av| av在线播放一区二区三区| 国内精品视频免费| 韩国中文免费在线视频| 中文字幕的久久| 中文字幕在线中文字幕日亚韩一区| 乱人伦中文视频在线| 夜夜嗨av一区二区三区| 精品久久一二三| av亚洲一区| 91精品国产乱| 成人欧美精品一区二区| 欧洲亚洲视频| 中文在线资源观看视频网站免费不卡| 亚洲精品国产精品乱码在线观看| 在线观看日韩| 欧美一级在线播放| 在线亚洲欧美日韩| 高清国产一区二区| 日本一区二区三区四区在线观看| 日本在线视频网| 亚洲一区二区偷拍精品| 国产亚洲欧美在线视频| 福利一区在线| 亚洲福利影片在线| www..com.cn蕾丝视频在线观看免费版 | 大伊人狠狠躁夜夜躁av一区| 男人天堂成人在线| 精品中文在线| 亚洲免费av网址| 91视频青青草| 亚洲欧美日韩国产综合精品二区| 国产日韩精品入口| 先锋av资源站| 亚洲欧美日韩国产综合| 欧美网站免费观看| 国语精品视频| 中国人与牲禽动交精品| 国产无遮挡又黄又爽又色| 日本视频一区二区三区| 国产精品视频免费观看| 日本在线人成| 欧美性猛交xxxx富婆弯腰| 国产在线a视频| blacked蜜桃精品一区| 欧美激情视频在线观看| 正在播放亚洲精品| 26uuu成人网一区二区三区| 男人的天堂视频在线| 国产成人精品一区二三区在线观看 | 另类专区欧美制服同性| 草莓视频18免费观看| 福利一区在线观看| www.午夜色| 韩日精品一区| 亚洲一区二区精品| 亚洲精品男人的天堂| 国产在线视频不卡二| 亚洲精品一区二区三区四区五区 | 无码精品黑人一区二区三区| 日韩毛片视频在线看| 国产日产欧美视频| 国产调教精品| 欧美激情a在线| 国产精品国产三级国产普通话对白| 国产日韩欧美精品电影三级在线| 欧美日本视频在线观看| 美女av一区| 国色天香2019中文字幕在线观看| www.com在线观看| 综合久久国产九一剧情麻豆| 国产喷水theporn| 国内精品久久久久久久久电影网 | 国产免费av一区二区| 丁香婷婷综合网| 福利在线一区二区| 亚洲高清在线一区| 久久99久久亚洲国产| 国产xxxx在线观看| 亚洲精品免费在线播放| 黑人无套内谢中国美女| 国产伊人精品| 国产精品免费一区二区三区在线观看| 最爽无遮挡行房视频在线| 欧美精品在线观看一区二区| jizzjizzjizz国产| 精品亚洲aⅴ乱码一区二区三区| 亚洲一区在线直播| av日韩在线免费观看| 久久精品一区中文字幕| 国产欧美一区二区三区视频在线观看| 最新国产精品久久精品| 日本人dh亚洲人ⅹxx| 欧美视频一区| 国产日韩欧美精品| 成人午夜视屏| 色噜噜国产精品视频一区二区| 91精东传媒理伦片在线观看| 17c精品麻豆一区二区免费| www.日本久久| 伊人成人网在线看| 久久伦理网站| 日韩成人综合网| 蜜臀久久99精品久久久无需会员| 国产乱人乱偷精品视频| 亚洲va在线va天堂| 五级黄高潮片90分钟视频| 日日欢夜夜爽一区| 中文字幕日韩一区二区三区不卡| 国产一精品一av一免费爽爽| 欧美国产日韩一区二区在线观看| 亚洲av毛片成人精品| 欧美日韩精品一区二区三区四区| 中文字幕电影av| 不卡一二三区首页| 国产又黄又猛又粗| 亚洲欧美亚洲| 欧美高清性xxxxhd| 99re8精品视频在线观看| 欧美精品18videos性欧| 可以在线观看的av| 日韩视频国产视频| 69国产精品视频免费观看| 亚洲桃色在线一区| 久久久久亚洲av无码专区桃色| 久久99国产精品尤物| 一二三四视频社区在线| 久久精品国产亚洲夜色av网站| av成人午夜| 国产69精品久久| 日韩在线视频网站| 污污的视频网站在线观看| 欧美老女人在线| 日本在线观看中文字幕| 国产精品久久毛片av大全日韩| 亚洲男女在线观看| 激情综合色综合久久| 91精品91久久久中77777老牛| 中文字幕乱码亚洲无线精品一区 | 精品无码av一区二区三区| 日韩国产欧美三级| 91专区在线观看| 欧美日韩国产探花| 亚洲精品在线免费看| 一道本一区二区三区| av免费观看久久| 四虎精品在线观看| 日韩av电影手机在线| 51漫画成人app入口| 久久国产精彩视频| 国产免费永久在线观看| 亚洲国产精品va在线观看黑人| 国产在成人精品线拍偷自揄拍| 日韩欧美中文字幕在线观看 | 欧美国产91| 一道精品一区二区三区| 国产欧美日韩| 久久亚洲综合网| 韩国精品福利一区二区三区| 91亚洲精品视频| 久久人体av| 国产精品老牛影院在线观看| 在线观看欧美日韩电影| 午夜精品一区二区三区在线视频| 天使と恶魔の榨精在线播放| 最近2019好看的中文字幕免费| 国产在线观看免费网站| 精品夜色国产国偷在线| 亚洲日本国产精品| 亚洲国产成人精品久久| 日韩在线观看视频网站| 亚洲成**性毛茸茸| 性感美女一级片| 亚洲国产99精品国自产| 色婷婷av一区二区三区之红樱桃| 精品国产自在久精品国产| 999久久久久| 日韩欧美一级精品久久| 国产成人麻豆精品午夜在线| 日韩欧美成人激情| 黄色aaa毛片| 亚洲成年人在线播放| 亚洲av电影一区| 亚洲色图国产精品| 69久久久久| 久久精视频免费在线久久完整在线看| 免费a级在线播放| 美女少妇精品视频| 免费污视频在线| 久久久久在线观看| 天堂电影一区| 国产精品久久久久久久午夜| 日本一道高清亚洲日美韩| 成人深夜直播免费观看| 久久综合偷偷噜噜噜色| 国产精品二区在线观看| 麻豆一区二区麻豆免费观看| 日本在线播放一区| 天天综合亚洲| 日韩成人三级视频| 香蕉国产精品偷在线观看不卡| 国产精品无码av无码| 欧美aaa在线| 日韩av成人网| 国产亚洲成aⅴ人片在线观看| 丁香六月激情综合| 亚洲品质自拍视频| 日韩在线视频免费播放| 在线视频一区二区三区| av综合在线观看| 日韩国产欧美区| shkd中文字幕久久在线观看| 成年无码av片在线| 这里有精品可以观看| 国产人妖伪娘一区91| 91麻豆精品激情在线观看最新 | 欧美国产一区二区三区激情无套| 超级碰在线观看| 亚洲永久免费| www.色就是色.com| 99re这里都是精品| www久久久久久久| 亚洲一区成人在线| 欧美一级黄视频| 欧美电影免费提供在线观看| 国产在线观看免费| 久久噜噜噜精品国产亚洲综合| 丝袜美腿诱惑一区二区三区| 91传媒视频在线观看| 国产成人调教视频在线观看 | 超碰公开在线| 欧美在线观看网站| 高清在线一区二区| 日韩久久久久久久| 亚洲国产免费看| www.cao超碰| 久久久精品综合| 久久精品免费在线| 欧美日韩电影在线播放| 婷婷亚洲一区二区三区| 欧美成人激情视频| 日本黄色一区| 欧美亚州在线观看| 国产综合精品一区| 九九热免费在线观看| 国产视频一区不卡| 免费在线不卡视频| 日韩欧美中文字幕公布| 在线观看a视频| 国产999精品久久久影片官网| 第一区第二区在线| 97在线免费视频观看| 六月婷婷色综合| 超薄肉色丝袜一二三| 天天爽夜夜爽夜夜爽精品视频| 国产哺乳奶水91在线播放| 最近2019年好看中文字幕视频| 伊人网在线播放| 风间由美一区二区三区| 在线一区免费| 国产女同无遮挡互慰高潮91| 中文字幕免费不卡在线| 欧美一级做a爰片免费视频| 亚洲日韩中文字幕在线播放| 中国色在线日|韩| 国产精品免费视频一区二区| 午夜久久久久| 中文字幕在线观看视频www| 亚洲天堂精品在线观看| 97人妻精品一区二区三区软件| 主播福利视频一区| 成人a在线观看高清电影| 神马影院一区二区三区| 久久青草久久| www.黄色在线| 色天天综合久久久久综合片| 欧美色综合一区二区三区| 欧洲亚洲在线视频| 中文有码一区| 最近免费中文字幕中文高清百度| 国产亚洲欧洲997久久综合| 最新在线中文字幕| 日韩中文在线中文网在线观看| 国产精品久久久久久妇女| 影音先锋亚洲视频| 国产一区二区在线看| 激情综合网五月天| 亚洲第一区第一页| 天堂av在线| 亚洲欧美国产精品桃花| 久久成人免费网| 青青草手机视频在线观看| 精品国产sm最大网站| 亚洲国产成人二区| 亚欧精品在线| 国产一区二区三区精品欧美日韩一区二区三区 | 久久综合狠狠综合| 国产偷人爽久久久久久老妇app| 中文字幕精品在线| 国产亚洲久久| 欧美一区二区三区爽大粗免费| 久久综合九色综合97_久久久| 久久久国产免费| 久久精品亚洲热| 国产色噜噜噜91在线精品| 欧在线一二三四区| 亚洲色欲色欲www| 日日夜夜精品免费| 国产精品久久一区主播| 欧美在线视屏| 三叶草欧洲码在线| 7777精品伊人久久久大香线蕉的| 蜜乳av一区| 日韩精品伦理第一区| 国产美女在线精品| 一级片免费在线播放| www.欧美精品一二三区| 久久视频在线观看| 69久久久久久| 亚洲成人自拍一区| 日本在线视频站| 噜噜噜噜噜久久久久久91| 精品一区二区三区在线播放| 国产在线综合网| 日韩在线观看免费高清| 美女午夜精品| 亚洲男人天堂2021| 色综合久久中文字幕| 男女视频在线| 中文字幕乱码一区二区三区|