Java CountDownLatch應(yīng)用

Java的concurrent包里面的CountDownLatch其實(shí)可以把它看作一個(gè)計(jì)數(shù)器结借,只不過這個(gè)計(jì)數(shù)器的操作是原子操作,同時(shí)只能有一個(gè)線程去操作這個(gè)計(jì)數(shù)器卒茬,也就是同時(shí)只能有一個(gè)線程去減這個(gè)計(jì)數(shù)器里面的值船老。
你可以向CountDownLatch對(duì)象設(shè)置一個(gè)初始的數(shù)字作為計(jì)數(shù)值,任何調(diào)用這個(gè)對(duì)象上的await()方法都會(huì)阻塞扬虚,直到這個(gè)計(jì)數(shù)器的計(jì)數(shù)值被其他的線程減為0為止努隙。
CountDownLatch的一個(gè)非常典型的應(yīng)用場(chǎng)景是:有一個(gè)任務(wù)想要往下執(zhí)行,但必須要等到其他的任務(wù)執(zhí)行完畢后才可以繼續(xù)往下執(zhí)行辜昵。假如我們這個(gè)想要繼續(xù)往下執(zhí)行的任務(wù)調(diào)用一個(gè)CountDownLatch對(duì)象的await()方法荸镊,其他的任務(wù)執(zhí)行完自己的任務(wù)后調(diào)用同一個(gè)CountDownLatch對(duì)象上的countDown()方法,這個(gè)調(diào)用await()方法的任務(wù)將一直阻塞等待,直到這個(gè)CountDownLatch對(duì)象的計(jì)數(shù)值減到0為止躬存。
舉個(gè)例子张惹,有三個(gè)工人在為老板干活,這個(gè)老板有一個(gè)習(xí)慣岭洲,就是當(dāng)三個(gè)工人把一天的活都干完了的時(shí)候宛逗,他就來檢查所有工人所干的活。記住這個(gè)條件:三個(gè)工人先全部干完活盾剩,老板才檢查雷激。所以在這里用Java代碼設(shè)計(jì)兩個(gè)類,Worker代表工人告私,Boss代表老板屎暇,具體的代碼實(shí)現(xiàn)如下:

worker類

package org.zapldy.concurrent;  
  
import java.util.Random;  
import java.util.concurrent.CountDownLatch;  
import java.util.concurrent.TimeUnit;  
  
public class Worker implements Runnable{  
      
    private CountDownLatch downLatch;  
    private String name;  
      
    public Worker(CountDownLatch downLatch, String name){  
        this.downLatch = downLatch;  
        this.name = name;  
    }  
      
    public void run() {  
        this.doWork();  
        try{  
            TimeUnit.SECONDS.sleep(new Random().nextInt(10));  
        }catch(InterruptedException ie){  
        }  
        System.out.println(this.name + "活干完了!");  
        this.downLatch.countDown();  
          
    }  
      
    private void doWork(){  
        System.out.println(this.name + "正在干活!");  
    }  
      
}  

boss類

package org.zapldy.concurrent;  
  
import java.util.concurrent.CountDownLatch;  
  
public class Boss implements Runnable {  
  
    private CountDownLatch downLatch;  
      
    public Boss(CountDownLatch downLatch){  
        this.downLatch = downLatch;  
    }  
      
    public void run() {  
        System.out.println("老板正在等所有的工人干完活......");  
        try {  
            this.downLatch.await();  
        } catch (InterruptedException e) {  
        }  
        System.out.println("工人活都干完了驻粟,老板開始檢查了根悼!");  
    }  
  
}  
package org.zapldy.concurrent;  
  
import java.util.concurrent.CountDownLatch;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
  
public class CountDownLatchDemo {  
  
    public static void main(String[] args) {  
        ExecutorService executor = Executors.newCachedThreadPool();  
          
        CountDownLatch latch = new CountDownLatch(3);  
          
        Worker w1 = new Worker(latch,"張三");  
        Worker w2 = new Worker(latch,"李四");  
        Worker w3 = new Worker(latch,"王二");  
          
        Boss boss = new Boss(latch);  
          
        executor.execute(w3);  
        executor.execute(w2);  
        executor.execute(w1);  
        executor.execute(boss);  
          
        executor.shutdown();  
    }  
  
}  

當(dāng)你運(yùn)行CountDownLatchDemo這個(gè)對(duì)象的時(shí)候,你會(huì)發(fā)現(xiàn)是等所有的工人都干完了活蜀撑,老板才來檢查挤巡,下面是我本地機(jī)器上運(yùn)行的一次結(jié)果,可以肯定的每次運(yùn)行的結(jié)果可能與下面不一樣酷麦,但老板檢查永遠(yuǎn)是在后面的矿卑。

王二正在干活!
李四正在干活!
老板正在等所有的工人干完活......
張三正在干活!
張三活干完了!
王二活干完了贴铜!
李四活干完了粪摘!
工人活都干完了,老板開始檢查了绍坝!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末徘意,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子轩褐,更是在濱河造成了極大的恐慌椎咧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件把介,死亡現(xiàn)場(chǎng)離奇詭異勤讽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拗踢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門脚牍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人巢墅,你說我怎么就攤上這事诸狭∪颍” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵驯遇,是天一觀的道長芹彬。 經(jīng)常有香客問我,道長叉庐,這世上最難降的妖魔是什么舒帮? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮陡叠,結(jié)果婚禮上玩郊,老公的妹妹穿的比我還像新娘。我一直安慰自己匾竿,他們只是感情好瓦宜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岭妖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪反璃。 梳的紋絲不亂的頭發(fā)上昵慌,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音淮蜈,去河邊找鬼斋攀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛梧田,可吹牛的內(nèi)容都是我干的淳蔼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼裁眯,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鹉梨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起穿稳,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤存皂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后逢艘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旦袋,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年它改,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疤孕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡央拖,死狀恐怖祭阀,靈堂內(nèi)的尸體忽然破棺而出鹉戚,到底是詐尸還是另有隱情,我是刑警寧澤柬讨,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布崩瓤,位于F島的核電站,受9級(jí)特大地震影響踩官,放射性物質(zhì)發(fā)生泄漏却桶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一蔗牡、第九天 我趴在偏房一處隱蔽的房頂上張望颖系。 院中可真熱鬧,春花似錦辩越、人聲如沸嘁扼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趁啸。三九已至,卻和暖如春督惰,著一層夾襖步出監(jiān)牢的瞬間不傅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工赏胚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留访娶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓觉阅,卻偏偏與公主長得像崖疤,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子典勇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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