CountDownLatch的使用及與join的區(qū)別

CountDownLatch概念

CountDownLatch又被稱為倒計(jì)時(shí)鎖凯砍,它是一個(gè)同步輔助類蓬衡,它允許一個(gè)或多個(gè)線程一直等待直到其他線程執(zhí)行完畢才開始執(zhí)行唇礁。用給定的計(jì)數(shù)初始化CountDownLatch,其含義是要被等待執(zhí)行完的線程個(gè)數(shù)路鹰。每次調(diào)用CountDown()贷洲,計(jì)數(shù)減1。
主程序執(zhí)行到await()函數(shù)會(huì)阻塞等待線程的執(zhí)行晋柱,直到計(jì)數(shù)為0
我們來看下它的方法优构。

public CountDownLatch(int count); //指定計(jì)數(shù)的次數(shù),只能被設(shè)置1次

public void countDown();          //調(diào)用此方法則計(jì)數(shù)減1

public void await() throws InterruptedException   //調(diào)用此方法會(huì)一直阻塞當(dāng)前線程雁竞,直到計(jì)時(shí)器的值為0钦椭,除非線程被中斷。

Public Long getCount();           //得到當(dāng)前的計(jì)數(shù)

Public boolean await(long timeout, TimeUnit unit) //調(diào)用此方法會(huì)一直阻塞當(dāng)前線程碑诉,直到計(jì)時(shí)器的值為0彪腔,除非線程被中斷或者計(jì)數(shù)器超時(shí),返回false代表計(jì)數(shù)器超時(shí)进栽。

CountDownLatch實(shí)例

模擬10人賽跑德挣。10人跑完后才喊"Game Over."

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class CountDownLatchTest {
    private static final int RUNNER_COUNT = 10;
    public static void main(String[] args) throws InterruptedException {
        final CountDownLatch begin = new CountDownLatch(1);
        final CountDownLatch end = new CountDownLatch(10);
        final ExecutorService exec = Executors.newFixedThreadPool(10);
        for (int i = 0; i < RUNNER_COUNT; i++) {
            final int NO = i + 1;
            //從1號(hào)到10號(hào)線程都在這里被建立
            Runnable run = new Runnable() {
                @Override
                public void run() {
                    try {
                        //所有線程阻塞在這里,等待槍響
                        begin.await();
                        //每個(gè)人跑完的時(shí)間
                        Thread.sleep((long)(Math.random() * 10000));
                        System.out.println("No." + NO + " arrived");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        //每跑完一個(gè)人快毛,倒計(jì)時(shí)鎖減一
                        end.countDown();//(倒計(jì)時(shí)鎖被減一)
                    }
                }
            };
            exec.submit(run);
        }

        System.out.println("Game Start ...");
        //槍響
        begin.countDown();//倒計(jì)時(shí)鎖被解除減一(begin解除)
        //等待所有人跑完
        end.await();//倒計(jì)時(shí)鎖沒有被解除之前盲厌,將被阻塞在這里
        end.await(30, TimeUnit.SECONDS);
        System.out.println("Game Over.");

        exec.shutdown();
    }

}

輸出

Game Start ...
No.6 arrived
No.4 arrived
No.10 arrived
No.3 arrived
No.9 arrived
No.5 arrived
No.8 arrived
No.7 arrived
No.1 arrived
No.2 arrived
Game Over.

CountDownLatch與join的區(qū)別

調(diào)用join方法需要等待thread執(zhí)行完畢才能繼續(xù)向下執(zhí)行,而CountDownLatch只需要檢查計(jì)數(shù)器的值為零就可以繼續(xù)向下執(zhí)行,相比之下祸泪,CountDownLatch更加靈活一些,可以實(shí)現(xiàn)一些更加復(fù)雜的業(yè)務(wù)場景建芙。

面試題

(1)解釋一下CountDownLatch概念?
(2)CountDownLatch 和CyclicBarrier的不同之處?
(3)給出一些CountDownLatch使用的例子?
(4) CountDownLatch 類中主要的方法?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末没隘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子禁荸,更是在濱河造成了極大的恐慌右蒲,老刑警劉巖阀湿,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瑰妄,居然都是意外死亡陷嘴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門间坐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灾挨,“玉大人,你說我怎么就攤上這事竹宋±统危” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵蜈七,是天一觀的道長秒拔。 經(jīng)常有香客問我,道長飒硅,這世上最難降的妖魔是什么砂缩? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮三娩,結(jié)果婚禮上庵芭,老公的妹妹穿的比我還像新娘。我一直安慰自己尽棕,他們只是感情好喳挑,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滔悉,像睡著了一般伊诵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上回官,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天曹宴,我揣著相機(jī)與錄音,去河邊找鬼歉提。 笑死笛坦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苔巨。 我是一名探鬼主播版扩,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侄泽!你這毒婦竟也來了礁芦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柿扣,沒想到半個(gè)月后肖方,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡未状,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年俯画,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片司草。...
    茶點(diǎn)故事閱讀 40,912評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡艰垂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翻伺,到底是詐尸還是另有隱情材泄,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布吨岭,位于F島的核電站拉宗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辣辫。R本人自食惡果不足惜旦事,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望急灭。 院中可真熱鬧姐浮,春花似錦、人聲如沸葬馋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畴嘶。三九已至蛋逾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窗悯,已是汗流浹背区匣。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒋院,地道東北人亏钩。 一個(gè)月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像欺旧,于是被迫代替她去往敵國和親姑丑。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評論 2 361

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