31.CompletableFuture

從JDK 8開始把将,在Concurrent包中提供了一個(gè)強(qiáng)大的異步編程工具CompletableFuture秸弛。在JDK8之前递览,異步編程可以通過(guò)線程池和Future來(lái)實(shí)現(xiàn)瞳腌,但功能還不夠強(qiáng)大。

1.用法

public static void main(String[] args) throws ExecutionException, InterruptedException { 
    CompletableFuture<String> future = new CompletableFuture<>(); 
    new Thread(() -> { 
        try {Thread.sleep(1000); 
    } catch (InterruptedException e) { 
        e.printStackTrace(); 
    } 
    future.complete("hello world"); 
}).start(); 
System.out.println("獲取結(jié)果中儿捧。。菲盾。"); 
String result = future.get(); 
System.out.println("獲取的結(jié)果:" + result); }

CompletableFuture實(shí)現(xiàn)了Future接口,所以它也具有Future的特性:調(diào)用get()方法會(huì)阻塞在那诡挂,直到結(jié)果返回临谱。
另外1個(gè)線程調(diào)用complete方法完成該Future,則所有阻塞在get()方法的線程都將獲得返回結(jié)果城豁。

1.1 runAsync與supplyAsync

  • CompletableFuture.runAsync(...)傳入的是一個(gè)Runnable接口
  • supplyAsync(Supplier)

區(qū)別:supplyAsync任務(wù)有返回值唱星。沒有返回值的任務(wù)剖膳,提交的是Runnable,返回的是CompletableFuture<Void>甸饱;有返回值的任務(wù)叹话,提交的是 Supplier墩瞳,返回的是
CompletableFuture<String>。Supplier和前面的Callable很相似热凹。

1.2 thenRun泪电、thenAccept和thenApply

對(duì)于 Future,在提交任務(wù)之后碟渺,只能調(diào)用 get()等結(jié)果返回苫拍;但對(duì)于 CompletableFuture,可以在結(jié)果上面再加一個(gè)callback绒极,當(dāng)?shù)玫浇Y(jié)果之后,再接著執(zhí)行callback伏社。

  • CompletableFuture.supplyAsync(....).thenRun();
  • CompletableFuture.supplyAsync(....).thenAccept((param)->....);
  • CompletableFuture.supplyAsync(....).thenApply(new Function<String, Integer>()...);
  1. thenRun后面跟的是一個(gè)無(wú)參數(shù)摘昌、無(wú)返回值的方法高蜂,即Runnable,所以最終的返回值是CompletableFuture<Void>類型稿饰。
  2. thenAccept后面跟的是一個(gè)有參數(shù)喉镰、無(wú)返回值的方法惭笑,稱為Consumer,返回值也是CompletableFuture<Void>類型捺宗。顧名思義川蒙,只進(jìn)不出,所以稱為Consumer昼牛;前面的Supplier匾嘱,是無(wú)參數(shù)早抠,有返回值撬讽,只出不進(jìn)悬垃,和Consumer剛好相反尝蠕。
  3. thenApply 后面跟的是一個(gè)有參數(shù)看彼、有返回值的方法囚聚,稱為Function。返回值是CompletableFuture<String>類型

1.3thenCompose茁计、thenCombine

thenCompose

thenApply接收的是一個(gè)Function星压,但是這個(gè)Function的返回值是一個(gè)通常的基本數(shù)據(jù)類型或一個(gè)對(duì)象鬼譬,而不是另外一個(gè) CompletableFuture。如果 Function 的返回值也是一個(gè)CompletableFuture优质,就會(huì)出現(xiàn)嵌套的CompletableFuture盆赤。

如果希望返回值是一個(gè)非嵌套的CompletableFuture,可以使用thenCompose颤枪。

CompletableFuture.supplyAsync(new Supplier<T>({..})..thenCompose(new Function<String, CompletionStage<T>>(){...});

thenCombine

在2個(gè) CompletableFuture 完成之后淑际,把2個(gè)CompletableFuture的返回值傳進(jìn)去,再額外做一些事情盗胀。實(shí)例如下:


1.4任意個(gè)CompletableFuture的組合

  • 上面的thenCompose和thenCombine只能組合2個(gè)CompletableFuture锄贼,而接下來(lái)的allOf 和anyOf 可以組合任意多個(gè)CompletableFuture。
  • 兩個(gè)方法都是靜態(tài)方法浸策,參數(shù)是變長(zhǎng)的CompletableFuture的集合惹盼。其次,allOf和anyOf的區(qū)別蚯舱,前者是“與”掩蛤,后者是“或”。
  • allOf需要所有的CompletableFuture 完成才返回凶掰,所以返回值是CompletableFuture<Void>類型懦窘,這是因?yàn)槊總€(gè)傳入的CompletableFuture的返回值都可能不同,所以組合的結(jié)果是無(wú)法用某種類型來(lái)表示的畅涂,索性返回Void類型道川。
  • anyOf 的含義是只要有任意一個(gè) CompletableFuture 結(jié)束冒萄,就可以做接下來(lái)的事情,而無(wú)須像AllOf那樣帅戒,等待所有的CompletableFuture結(jié)束
1.5四種任務(wù)原型

runAsync 與 supplierAsync 是 CompletableFuture 的靜態(tài)方法逻住;而 thenAccept迎献、thenAsync、thenApply是CompletableFutre的成員方法扒秸。
因?yàn)槌跏嫉臅r(shí)候沒有CompletableFuture對(duì)象,也沒有參數(shù)可傳鸦采,所以提交的只能是Runnable或者Supplier,只能是靜態(tài)方法;


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锣吼,一起剝皮案震驚了整個(gè)濱河市玄叠,隨后出現(xiàn)的幾起案子拓提,更是在濱河造成了極大的恐慌,老刑警劉巖寺惫,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件西雀,死亡現(xiàn)場(chǎng)離奇詭異歉摧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)再悼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門冲九,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人娘侍,你說(shuō)我怎么就攤上這事泳炉。” “怎么了氧腰?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵古拴,是天一觀的道長(zhǎng)黄痪。 經(jīng)常有香客問我,道長(zhǎng)桅打,這世上最難降的妖魔是什么挺尾? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任遭铺,我火速辦了婚禮,結(jié)果婚禮上甫题,老公的妹妹穿的比我還像新娘锰蓬。我一直安慰自己芹扭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布辅肾。 她就那樣靜靜地躺著矫钓,像睡著了一般舍杜。 火紅的嫁衣襯著肌膚如雪既绩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天私杜,我揣著相機(jī)與錄音,去河邊找鬼衰粹。 笑死铝耻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的替废。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼兽赁!你這毒婦竟也來(lái)了刀崖?” 一聲冷哼從身側(cè)響起亮钦,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蜂莉,失蹤者是張志新(化名)和其女友劉穎混卵,沒想到半個(gè)月后幕随,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辕录,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秒裕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肮塞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姻锁,到底是詐尸還是另有隱情枕赵,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布位隶,位于F島的核電站拷窜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏涧黄。R本人自食惡果不足惜篮昧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望笋妥。 院中可真熱鬧懊昨,春花似錦、人聲如沸酵颁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扁位。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間般卑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工饲梭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留憔涉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓跪但,卻偏偏與公主長(zhǎng)得像骨杂,于是被迫代替她去往敵國(guó)和親搓蚪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容