并行編程(Future)

說到并行茎芋,常見的幾種模式 “回調(diào)驅(qū)動(dòng)(多線程環(huán)境下)”颅眶、“消息/事件驅(qū)動(dòng)(Actor模型中)蜈出。
回調(diào)是最常見的異步并發(fā)模式,它有即時(shí)性高涛酗、接口設(shè)計(jì)簡(jiǎn)單等有點(diǎn)铡原。但相對(duì)于Future,其缺點(diǎn)也非常明顯商叹。
首先燕刻,多線程環(huán)境下的回調(diào)一般是在觸發(fā)回調(diào)的模塊線程中執(zhí)行的,這就意味著編寫回調(diào)方法時(shí)通常必須考慮線程互斥問題
其次剖笙,回調(diào)方式接口的提供者在本模塊的線程中執(zhí)行用戶應(yīng)用的回調(diào)也是相對(duì)不安全的卵洗,因?yàn)槟銦o法確定它會(huì)花費(fèi)多長(zhǎng)時(shí)間或出現(xiàn)什么異常,從而可能間接導(dǎo)致本模塊的即時(shí)性和可靠性受影響弥咪;
再者过蹂,使用回調(diào)接口不利于順序流程的開發(fā),因?yàn)榛卣{(diào)方法的執(zhí)行是孤立的聚至,要與正常流程匯合是比較困難的酷勺。因此回調(diào)接口適合于在回調(diào)中只需要完成簡(jiǎn)單任務(wù),并且不必與其它流程匯合的場(chǎng)景扳躬。

Future對(duì)象本身可以看作是一個(gè)顯式的引用脆诉,一個(gè)對(duì)異步處理結(jié)果的引用,可以通過調(diào)用Future.isDone()判斷引用的對(duì)象是否就緒甚亭,并采取不同的處理;而后一種情況則只需調(diào)用get()或
get(long timeout, TimeUnit unit)通過同步阻塞方式等待對(duì)象就緒击胜。實(shí)際運(yùn)行期是阻塞還是立即返回就取決于get()的調(diào)用時(shí)機(jī)和對(duì)象就緒的先后了.

Future的衍生

除了上面提到的基礎(chǔ)形態(tài)之外亏狰,F(xiàn)uture還有豐富的衍生變化,這里就列舉幾個(gè)常見的偶摔。

Lazy Future

與一般的Future不同骚揍,Lazy Future在創(chuàng)建之初不會(huì)主動(dòng)開始準(zhǔn)備引用的對(duì)象,而是等到請(qǐng)求對(duì)象時(shí)才開始相應(yīng)的工作啰挪。因此信不,Lazy Future本身并不是為了實(shí)現(xiàn)并發(fā),而是以節(jié)約不必要的運(yùn)算資源為出發(fā)點(diǎn)亡呵,效果上與Lambda/Closure類似抽活。例如設(shè)計(jì)某些API時(shí),你可能需要返回一組信息锰什,而其中某些信息的計(jì)算可能會(huì)耗費(fèi)可觀的資源下硕。但調(diào)用者不一定都關(guān)心所有的這些信息,因此將那些需要耗費(fèi)較多資源的對(duì)象以Lazy Future的形式提供汁胆,可以在調(diào)用者不需要用到特定的信息時(shí)節(jié)省資源梭姓。

另外Lazy Future也可以用于避免過早的獲取或鎖定資源而產(chǎn)生的不必要的互斥。

Promise

Promise可以看作是Future的一個(gè)特殊分支嫩码,常見的Future一般是由服務(wù)調(diào)用者直接觸發(fā)異步處理流程誉尖,比如調(diào)用服務(wù)時(shí)立即觸發(fā)處理或 Lazy Future的取值時(shí)觸發(fā)處理。但Promise則用于顯式表示那些異步流程并不直接由服務(wù)調(diào)用者觸發(fā)的情景铸题。例如Future接口的定時(shí)控制铡恕,其異步流程不是由調(diào)用者,而是由系統(tǒng)時(shí)鐘觸發(fā)丢间,再比如淘寶的分布式訂閱框架提供的Future式訂閱接口探熔,其等待數(shù)據(jù)的可用性不是由訂閱者決定,而在于發(fā)布者何時(shí)發(fā)布或更新數(shù)據(jù)烘挫。因此诀艰,相對(duì)于標(biāo)準(zhǔn)的Future,Promise接口一般會(huì)多出一個(gè)set()或fulfill()接口饮六。

可復(fù)用的Future

常規(guī)的Future是一次性的其垄,也就是說當(dāng)你獲得了異步的處理結(jié)果后,F(xiàn)uture對(duì)象本身就失去意義了喜滨。但經(jīng)過特殊設(shè)計(jì)的Future也可以實(shí)現(xiàn)復(fù)用捉捅,這對(duì)于可多次變更的數(shù)據(jù)顯得非常有用。例如前面提到的淘寶分布式訂閱框架所提供的Future式接口虽风,它允許多次調(diào)用waitNext()方法(相當(dāng)于Future.get())棒口,每次調(diào)用時(shí)是否阻塞取決于在上次調(diào)用后是否又有數(shù)據(jù)發(fā)布寄月,如果尚無更新,則阻塞直到下一次的數(shù)據(jù)發(fā)布无牵。這樣設(shè)計(jì)的好處是漾肮,接口的使用者可以在其任何合適的時(shí)機(jī),或者直接簡(jiǎn)單的在獨(dú)立的線程中通過一個(gè)無限循環(huán)響應(yīng)訂閱數(shù)據(jù)的變化茎毁,同時(shí)還可兼顧其它定時(shí)任務(wù)克懊,甚至同時(shí)等待多個(gè)Future。簡(jiǎn)化的例子如下:

for (;;) {
schedule = getNextScheduledTaskTime();
while(schedule > now()) {
try {
data = subscription.waitNext(schedule - now());
processData(data);
} catch(Exception e) {...}
}
doScheduledTask();
}

【原文來自:http://www.cnblogs.com/uptownBoy/articles/1772483.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末七蜘,一起剝皮案震驚了整個(gè)濱河市谭溉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌橡卤,老刑警劉巖扮念,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異碧库,居然都是意外死亡柜与,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門嵌灰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弄匕,“玉大人,你說我怎么就攤上這事沽瞭∏ń常” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵秕脓,是天一觀的道長(zhǎng)柒瓣。 經(jīng)常有香客問我,道長(zhǎng)吠架,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任搂鲫,我火速辦了婚禮傍药,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘魂仍。我一直安慰自己拐辽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布擦酌。 她就那樣靜靜地躺著俱诸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赊舶。 梳的紋絲不亂的頭發(fā)上睁搭,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天赶诊,我揣著相機(jī)與錄音,去河邊找鬼园骆。 笑死馅巷,一個(gè)胖子當(dāng)著我的面吹牛迂苛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼局齿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了员辩?” 一聲冷哼從身側(cè)響起撞鹉,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎余黎,沒想到半個(gè)月后炬太,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驯耻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年亲族,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片可缚。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡霎迫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帘靡,到底是詐尸還是另有隱情知给,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布描姚,位于F島的核電站涩赢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏轩勘。R本人自食惡果不足惜筒扒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绊寻。 院中可真熱鬧花墩,春花似錦、人聲如沸澄步。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽村缸。三九已至祠肥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梯皿,已是汗流浹背仇箱。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工县恕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人工碾。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓弱睦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親渊额。 傳聞我的和親對(duì)象是個(gè)殘疾皇子况木,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 接著上節(jié) condition_varible ,本節(jié)主要介紹future的內(nèi)容旬迹,練習(xí)代碼地址火惊。本文參考http:/...
    jorion閱讀 14,793評(píng)論 1 5
  • 異步編程對(duì)JavaScript語言太重要。Javascript語言的執(zhí)行環(huán)境是“單線程”的奔垦,如果沒有異步編程屹耐,根本...
    呼呼哥閱讀 7,311評(píng)論 5 22
  • 你不知道JS:異步 第三章:Promises 在第二章,我們指出了采用回調(diào)來表達(dá)異步和管理并發(fā)時(shí)的兩種主要不足:缺...
    purple_force閱讀 2,067評(píng)論 0 4
  • 一.非阻塞和異步 借用知乎用戶嚴(yán)肅的回答在此總結(jié)下椿猎,同步和異步是針對(duì)消息通信機(jī)制惶岭,同步代表一個(gè)client發(fā)出一個(gè)...
    Daniel_adu閱讀 1,825評(píng)論 0 8
  • 我特別喜歡雨后的感覺,其中的緣故我也道不清犯眠。大地經(jīng)過雨水的沖刷后又展示出一派新的景象:雨后的空氣異常的清新按灶,天...
    Carrie蝴蝶泉邊閱讀 422評(píng)論 0 5