線程同步輔助類CyclicBarrier

CyclicBarrier國內(nèi)有些人翻譯做柵欄臭家。

柵欄(Barrier)類似于閉鎖呵恢,它能阻塞一組線程直到某個事件發(fā)生种蘸。柵欄與閉鎖的關(guān)鍵區(qū)別在于墓赴,所有線程必須同時到達柵欄位置,才能繼續(xù)執(zhí)行航瞭。閉鎖用于等待事件诫硕,而柵欄用于等待其他線程。(柵欄則是所有線程相互等待沧奴,直到所有線程都到達某一點時才打開柵欄痘括,然后線程可以繼續(xù)執(zhí)行。)

CyclicBarrier 可以使一定數(shù)量的參與方反復(fù)地在柵欄位置匯集滔吠,它在并行迭代算法中非常有用纲菌。CyclicBarrier支持一個可選的Runnable參數(shù),當(dāng)線程通過柵欄時疮绷,runnable對象將被調(diào)用翰舌。構(gòu)造函數(shù)CyclicBarrier(int?parties,RunnablebarrierAction),當(dāng)線程在CyclicBarrier對象上調(diào)用await()方法時冬骚,柵欄的計數(shù)器將增加1椅贱,當(dāng)計數(shù)器為parties時懂算,柵欄將打開。

如:有這樣一個場景:五個人相約去鳥巢燒烤(不是爛大街的跑步了庇麦、/偷笑)计技,但是五個人是腿兒著去的(這不還是跑步嗎、/敲打/敲打)山橄,必須要等所有人都到達后才能開始燒烤垮媒,燒烤結(jié)束后各回各家。這里可以使用CyclicBarrier輕松實現(xiàn):

packagecom.java.nmq.cyclicbarrier;

importjava.util.concurrent.BrokenBarrierException;

importjava.util.concurrent.CyclicBarrier;

/**

* Created by niemengquan on 2017/4/13.

*/

public classRuningimplementsRunnable {

privateCyclicBarrierbarrier;

publicRuning(CyclicBarrier barrier){

this.barrier=barrier;

}

@Override

public voidrun() {

System.out.println(Thread.currentThread().getName()+":start to runing!");

try{

//模擬跑步的時間

Thread.sleep((long) (1000*Math.random()));

System.out.println(Thread.currentThread().getName()+":run done!");

//等待所有的人都跑完,到達約定的地點

barrier.await();

System.out.println(Thread.currentThread().getName()+":go home!");

}catch(InterruptedException e) {

e.printStackTrace();

}catch(BrokenBarrierException e) {

e.printStackTrace();

}

}

}

Running.java

?主類:

packagecom.java.nmq.cyclicbarrier;

importjava.util.concurrent.CyclicBarrier;

importjava.util.concurrent.ExecutorService;

importjava.util.concurrent.Executors;

/**

* 五個人相約去燒烤航棱,但要等所有人都到達目的地后才能開始睡雇。燒烤結(jié)束后各回各家

* Created by niemengquan on 2017/4/13.

*/

public classBarbecue {

public static voidmain(String[] args) {

CyclicBarrier barrier=newCyclicBarrier(5, newRunnable() {

@Override

public voidrun() {

try{

Thread.sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println("Everyone is here,starting BBQ!");

}

});

ExecutorService executorService = Executors.newFixedThreadPool(5);

for(inti=0;i<5;i++){

executorService.execute(newRuning(barrier));

}

executorService.shutdown();

}

}



Barbecue.java


由于目前平臺對代碼支持的不是太好,為便于查看以上代碼都附上了截圖饮醇。

運行結(jié)果:

pool-1-thread-1:start to runing!

pool-1-thread-2:start to runing!

pool-1-thread-3:start to runing!

pool-1-thread-4:start to runing!

pool-1-thread-5:start to runing!

pool-1-thread-2:run done!

pool-1-thread-1:run done!

pool-1-thread-4:run done!

pool-1-thread-5:run done!

pool-1-thread-3:run done!

Everyone is here,starting BBQ!

pool-1-thread-2:go home!

pool-1-thread-1:go home!

pool-1-thread-4:go home!

pool-1-thread-5:go home!

pool-1-thread-3:go home!

Process finished with exit code 0


運行結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末它抱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子朴艰,更是在濱河造成了極大的恐慌观蓄,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祠墅,死亡現(xiàn)場離奇詭異蜘腌,居然都是意外死亡,警方通過查閱死者的電腦和手機饵隙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沮脖,“玉大人金矛,你說我怎么就攤上這事∩捉欤” “怎么了驶俊?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長免姿。 經(jīng)常有香客問我饼酿,道長,這世上最難降的妖魔是什么胚膊? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任故俐,我火速辦了婚禮,結(jié)果婚禮上紊婉,老公的妹妹穿的比我還像新娘药版。我一直安慰自己,他們只是感情好喻犁,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布槽片。 她就那樣靜靜地躺著何缓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪还栓。 梳的紋絲不亂的頭發(fā)上碌廓,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音剩盒,去河邊找鬼谷婆。 笑死,一個胖子當(dāng)著我的面吹牛勃刨,可吹牛的內(nèi)容都是我干的波材。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼身隐,長吁一口氣:“原來是場噩夢啊……” “哼廷区!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贾铝,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤隙轻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后垢揩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玖绿,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年叁巨,在試婚紗的時候發(fā)現(xiàn)自己被綠了斑匪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡锋勺,死狀恐怖蚀瘸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庶橱,我是刑警寧澤贮勃,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站苏章,受9級特大地震影響寂嘉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枫绅,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一泉孩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧并淋,春花似錦棵譬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽曼尊。三九已至,卻和暖如春脏嚷,著一層夾襖步出監(jiān)牢的瞬間骆撇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工父叙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留神郊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓趾唱,卻偏偏與公主長得像涌乳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子甜癞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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