CountDownLatch 相關整理

1.背景:

  • countDownLatch是在java1.5被引入,跟它一起被引入的工具類還有CyclicBarrier、Semaphore凑队、concurrentHashMap和BlockingQueue。
  • 存在于java.util.cucurrent包下。

2.概念

  • countDownLatch這個類使一個線程等待其他線程各自執(zhí)行完畢后再執(zhí)行垄提。
  • 是通過一個計數(shù)器來實現(xiàn)的,計數(shù)器的初始值是線程的數(shù)量周拐。每當一個線程執(zhí)行完畢后怕磨,計數(shù)器的值就-1翅阵,當計數(shù)器的值為0時,表示所有線程都執(zhí)行完畢,然后在閉鎖上等待的線程就可以恢復工作了影所。

3.源碼

  • countDownLatch類中只提供了一個構造器
//參數(shù)count為計數(shù)值
public CountDownLatch(int count) {  };  
  • 類中有三個方法是最重要的:
//調用await()方法的線程會被掛起,它會等待直到count值為0才繼續(xù)執(zhí)行
public void await() throws InterruptedException { };   
//和await()類似恍涂,只不過等待一定的時間后count值還沒變?yōu)?的話就會繼續(xù)執(zhí)行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  
//將count值減1
public void countDown() { };  

4.示例

  • 普通示例:
public class CountDownLatchTest {

    public static void main(String[] args) {
        final CountDownLatch latch = new CountDownLatch(2);
        System.out.println("主線程開始執(zhí)行…… ……");
        //第一個子線程執(zhí)行
        ExecutorService es1 = Executors.newSingleThreadExecutor();
        es1.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    System.out.println("子線程:"+Thread.currentThread().getName()+"執(zhí)行");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                latch.countDown();
            }
        });
        es1.shutdown();

        //第二個子線程執(zhí)行
        ExecutorService es2 = Executors.newSingleThreadExecutor();
        es2.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("子線程:"+Thread.currentThread().getName()+"執(zhí)行");
                latch.countDown();
            }
        });
        es2.shutdown();
        System.out.println("等待兩個線程執(zhí)行完畢…… ……");
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("兩個子線程都執(zhí)行完畢哑舒,繼續(xù)執(zhí)行主線程");
    }
}

  • 結果集:
主線程開始執(zhí)行…… ……
等待兩個線程執(zhí)行完畢…… ……
子線程:pool-1-thread-1執(zhí)行
子線程:pool-2-thread-1執(zhí)行
兩個子線程都執(zhí)行完畢,繼續(xù)執(zhí)行主線程
  • 模擬并發(fā)示例:
public class Parallellimit {
    public static void main(String[] args) {
        ExecutorService pool = Executors.newCachedThreadPool();
        CountDownLatch cdl = new CountDownLatch(100);
        for (int i = 0; i < 100; i++) {
            CountRunnable runnable = new CountRunnable(cdl);
            pool.execute(runnable);
        }
    }
}

 class CountRunnable implements Runnable {
    private CountDownLatch countDownLatch;
    public CountRunnable(CountDownLatch countDownLatch) {
        this.countDownLatch = countDownLatch;
    }
    @Override
    public void run() {
        try {
            synchronized (countDownLatch) {
                /*** 每次減少一個容量*/
                countDownLatch.countDown();
                System.out.println("thread counts = " + (countDownLatch.getCount()));
            }
            countDownLatch.await();
            System.out.println("concurrency counts = " + (100 - countDownLatch.getCount()));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

*CountDownLatch和CyclicBarrier區(qū)別:
1.countDownLatch是一個計數(shù)器播急,線程完成一個記錄一個脓钾,計數(shù)器遞減,只能只用一次
2.CyclicBarrier的計數(shù)器更像一個閥門桩警,需要所有線程都到達可训,然后繼續(xù)執(zhí)行,計數(shù)器遞增捶枢,提供reset功能握截,可以多次使用

原文鏈接
作者:指尖架構141319
鏈接:http://www.reibang.com/p/e233bb37d2e6

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市烂叔,隨后出現(xiàn)的幾起案子谨胞,更是在濱河造成了極大的恐慌,老刑警劉巖蒜鸡,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畜眨,死亡現(xiàn)場離奇詭異昼牛,居然都是意外死亡,警方通過查閱死者的電腦和手機康聂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門贰健,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恬汁,你說我怎么就攤上這事伶椿。” “怎么了氓侧?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵脊另,是天一觀的道長。 經常有香客問我约巷,道長偎痛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任独郎,我火速辦了婚禮踩麦,結果婚禮上,老公的妹妹穿的比我還像新娘氓癌。我一直安慰自己谓谦,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布贪婉。 她就那樣靜靜地躺著反粥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疲迂。 梳的紋絲不亂的頭發(fā)上才顿,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音尤蒿,去河邊找鬼郑气。 笑死,一個胖子當著我的面吹牛优质,可吹牛的內容都是我干的。 我是一名探鬼主播军洼,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼巩螃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匕争?” 一聲冷哼從身側響起避乏,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甘桑,沒想到半個月后拍皮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歹叮,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年铆帽,在試婚紗的時候發(fā)現(xiàn)自己被綠了咆耿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡爹橱,死狀恐怖萨螺,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情愧驱,我是刑警寧澤慰技,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站组砚,受9級特大地震影響吻商,放射性物質發(fā)生泄漏。R本人自食惡果不足惜糟红,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一艾帐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧改化,春花似錦掩蛤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至句旱,卻和暖如春阳藻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谈撒。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工腥泥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人啃匿。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓蛔外,卻偏偏與公主長得像,于是被迫代替她去往敵國和親溯乒。 傳聞我的和親對象是個殘疾皇子夹厌,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348