多線程Callable+Future和CompletableFuture

一. Future

JDK 5引入了Future模式。Future接口是Java多線程Future模式的實(shí)現(xiàn)谓晌,在java.util.concurrent包中,可以來進(jìn)行異步計算癞揉。

Future模式是多線程設(shè)計常用的一種設(shè)計模式纸肉。Future模式可以理解成:我有一個任務(wù),提交給了Future喊熟,F(xiàn)uture替我完成這個任務(wù)柏肪。期間我自己可以去做任何想做的事情。一段時間之后芥牌,我就便可以從Future那兒取出結(jié)果烦味。

Future的接口很簡單,只有五個方法壁拉。

Future接口的方法介紹如下:

boolean cancel (boolean mayInterruptIfRunning) 取消任務(wù)的執(zhí)行谬俄。參數(shù)指定是否立即中斷任務(wù)執(zhí)行,或者等等任務(wù)結(jié)束

boolean isCancelled () 任務(wù)是否已經(jīng)取消弃理,任務(wù)正常完成前將其取消溃论,則返回 true

boolean isDone () 任務(wù)是否已經(jīng)完成。需要注意的是如果任務(wù)正常終止案铺、異呈呓妫或取消梆靖,都將返回true

V get () throws InterruptedException, ExecutionException? 等待任務(wù)執(zhí)行結(jié)束控汉,然后獲得V類型的結(jié)果笔诵。InterruptedException 線程被中斷異常, ExecutionException任務(wù)執(zhí)行異常姑子,如果任務(wù)被取消乎婿,還會拋出CancellationException

V get (long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 同上面的get功能一樣,多了設(shè)置超時時間街佑。參數(shù)timeout指定超時時間谢翎,uint指定時間的單位,在枚舉類TimeUnit中有相關(guān)的定義沐旨。如果計 算超時森逮,將拋出TimeoutException

一般情況下,我們會結(jié)合Callable和Future一起使用磁携,通過ExecutorService的submit方法執(zhí)行Callable褒侧,并返回Future。

future


callable

比起future.get()谊迄,其實(shí)更推薦使用get (long timeout, TimeUnit unit) 方法闷供,設(shè)置了超時時間可以防止程序無限制的等待future的結(jié)果。

二. CompletableFuture介紹

2.1 Future模式的缺點(diǎn)

Future雖然可以實(shí)現(xiàn)獲取異步執(zhí)行結(jié)果的需求统诺,但是它沒有提供通知的機(jī)制歪脏,我們無法得知Future什么時候完成。

要么使用阻塞粮呢,在future.get()的地方等待future返回的結(jié)果婿失,這時又變成同步操作。要么使用isDone()輪詢地判斷Future是否完成啄寡,這樣會耗費(fèi)CPU的資源移怯。

2.2 CompletableFuture介紹

Netty、Guava分別擴(kuò)展了Java 的 Future 接口这难,方便異步編程舟误。

Java 8新增的CompletableFuture類正是吸收了所有Google Guava中ListenableFuture和SettableFuture的特征,還提供了其它強(qiáng)大的功能姻乓,讓Java擁有了完整的非阻塞編程模型:Future嵌溢、Promise 和 Callback(在Java8之前,只有無Callback 的Future)蹋岩。

CompletableFuture能夠?qū)⒒卣{(diào)放到與任務(wù)不同的線程中執(zhí)行赖草,也能將回調(diào)作為繼續(xù)執(zhí)行的同步函數(shù),在與任務(wù)相同的線程中執(zhí)行剪个。它避免了傳統(tǒng)回調(diào)最大的問題秧骑,那就是能夠?qū)⒖刂屏鞣蛛x到不同的事件處理器中。

CompletableFuture彌補(bǔ)了Future模式的缺點(diǎn)。在異步的任務(wù)完成后乎折,需要用其結(jié)果繼續(xù)操作時绒疗,無需等待÷畛危可以直接通過thenAccept吓蘑、thenApply、thenCompose等方式將前面異步處理的結(jié)果交給另外一個異步事件處理線程來處理坟冲。

三. CompletableFuture特性

3.1 CompletableFuture的靜態(tài)工廠方法

runAsync 和 supplyAsync 方法的區(qū)別是runAsync返回的CompletableFuture是沒有返回值的磨镶。


而supplyAsync返回的CompletableFuture是由返回值的,下面的代碼打印了future的返回值健提。

3.2 Completable


future.get()在等待執(zhí)行結(jié)果時琳猫,程序會一直block,如果此時調(diào)用complete(T t)會立即執(zhí)行私痹。

可以看到future調(diào)用complete(T t)會立即執(zhí)行脐嫂。但是complete(T t)只能調(diào)用一次,后續(xù)的重復(fù)調(diào)用會失效侄榴。

如果future已經(jīng)執(zhí)行完畢能夠返回結(jié)果雹锣,此時再調(diào)用complete(T t)則會無效。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末癞蚕,一起剝皮案震驚了整個濱河市蕊爵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桦山,老刑警劉巖攒射,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恒水,居然都是意外死亡会放,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門钉凌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咧最,“玉大人,你說我怎么就攤上這事御雕∈秆兀” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵酸纲,是天一觀的道長捣鲸。 經(jīng)常有香客問我,道長闽坡,這世上最難降的妖魔是什么栽惶? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任愁溜,我火速辦了婚禮,結(jié)果婚禮上外厂,老公的妹妹穿的比我還像新娘冕象。我一直安慰自己,他們只是感情好酣衷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布交惯。 她就那樣靜靜地躺著次泽,像睡著了一般穿仪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上意荤,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天啊片,我揣著相機(jī)與錄音,去河邊找鬼玖像。 笑死紫谷,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捐寥。 我是一名探鬼主播笤昨,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼握恳!你這毒婦竟也來了瞒窒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤乡洼,失蹤者是張志新(化名)和其女友劉穎崇裁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體束昵,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拔稳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锹雏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巴比。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖礁遵,靈堂內(nèi)的尸體忽然破棺而出轻绞,到底是詐尸還是另有隱情,我是刑警寧澤榛丢,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布铲球,位于F島的核電站,受9級特大地震影響晰赞,放射性物質(zhì)發(fā)生泄漏稼病。R本人自食惡果不足惜选侨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望然走。 院中可真熱鬧援制,春花似錦、人聲如沸芍瑞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拆檬。三九已至洪己,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間竟贯,已是汗流浹背答捕。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屑那,地道東北人拱镐。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像持际,于是被迫代替她去往敵國和親沃琅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

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