CountDownLatch/CyclicBarrier/Semaphore

這三個類都是基于AQS實現(xiàn)的類拦焚,也是面試中惩峒埽考的類,今天我們來學(xué)習(xí)一下這三個類的用法夺鲜。
  1. CountDownLatch:
    Count:數(shù)數(shù)
    Down:向下
    Latch:門閂
    顧名思義皆尔,這個類就是用來“倒計時”的,可以用來讓一個線程或多個線程等待多個線程币励。

下面看例子:
這個例子模擬的是同學(xué)下晚自習(xí)后慷蠕,班長關(guān)門的事件。正常情況是等所有同學(xué)都走完之后食呻,然后班長鎖門流炕,離開教室。這里新建五個線程模擬同學(xué)仅胞,主線程代表班長每辟。

public class Test {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName() + "\t同學(xué)離開教室");
            },String.valueOf(i)).start();
        }
        System.out.println(Thread.currentThread().getName() + "班長離開教室,鎖門");
    }
}
1   同學(xué)離開教室
2   同學(xué)離開教室
3   同學(xué)離開教室
4   同學(xué)離開教室
main班長離開教室干旧,鎖門
5   同學(xué)離開教室

可以看到還剩一位同學(xué)沒走渠欺,班長就把門鎖上了,這肯定是不行的莱革,我們來用CountDownLatch來解決這個問題峻堰。

import java.util.concurrent.CountDownLatch;

public class Test {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(5);//設(shè)置初始門閂值,模擬還有五個同學(xué)在教室
        for (int i = 1; i <= 5; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName() + "\t同學(xué)離開教室");
                countDownLatch.countDown();//每有一個同學(xué)離開教室盅视,門閂的值就減1
            },String.valueOf(i)).start();
        }
        countDownLatch.await();//門閂的值減到0之前,main線程阻塞
        System.out.println(Thread.currentThread().getName() + "班長離開教室旦万,鎖門");
    }
}
1   同學(xué)離開教室
2   同學(xué)離開教室
3   同學(xué)離開教室
4   同學(xué)離開教室
5   同學(xué)離開教室
main班長離開教室闹击,鎖門

再無論怎么運行,main線程一定會等五個線程都運行之后才會輸出成艘。

  1. CyclicBarrier
    用來控制多個線程互相等待赏半,只有所有線程全部到達后,這些線程才會繼續(xù)執(zhí)行淆两。
    CyclicBarrier有兩個構(gòu)造方法:

    public CyclicBarrier(int parties){
    }
    
    public CyclicBarrier(int parties,Runnable barrierAction){
    }
    

    當(dāng)所有的線程都到達時断箫,會觸發(fā)barrierAction


import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class Test {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7,new Thread(()-> {
            System.out.println("召喚神龍");
        }));//等待七個線程到位之后,執(zhí)行"System.out.println("召喚神龍");" 任務(wù)秋冰。

        for (int i = 1; i <= 7; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName() + "顆龍珠已經(jīng)收集");
                try {
                    cyclicBarrier.await();//設(shè)置屏障仲义,等待所有線程到位
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },String.valueOf(i)).start();
        }
    }
}

  1. semaphore
    中文名:信號量,用于控制多個線程對互斥資源的訪問控制剑勾。
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class Test {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(3); // 模擬總共有三個車位

        /*
           用六個線程來模擬有六輛車要搶占三個車位
         */
        for (int i = 1; i <= 6; i++) {
            new Thread(() -> {
                try {
                    semaphore.acquire(); //搶占資源
                    System.out.println(Thread.currentThread().getName() + "\t搶到車位");
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println(Thread.currentThread().getName() + "\t等待三秒后離開車位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    semaphore.release();//釋放資源
                }
            },String.valueOf(i)).start();
        }
    }
}
1   搶到車位
2   搶到車位
3   搶到車位
2   等待三秒后離開車位
3   等待三秒后離開車位
1   等待三秒后離開車位
4   搶到車位
6   搶到車位
5   搶到車位
4   等待三秒后離開車位
6   等待三秒后離開車位
5   等待三秒后離開車位
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末埃撵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子虽另,更是在濱河造成了極大的恐慌暂刘,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捂刺,死亡現(xiàn)場離奇詭異谣拣,居然都是意外死亡募寨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門森缠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拔鹰,“玉大人,你說我怎么就攤上這事辅鲸「裼簦” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵独悴,是天一觀的道長例书。 經(jīng)常有香客問我,道長刻炒,這世上最難降的妖魔是什么决采? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮坟奥,結(jié)果婚禮上树瞭,老公的妹妹穿的比我還像新娘。我一直安慰自己爱谁,他們只是感情好晒喷,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著访敌,像睡著了一般凉敲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寺旺,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天爷抓,我揣著相機與錄音,去河邊找鬼阻塑。 笑死蓝撇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陈莽。 我是一名探鬼主播渤昌,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼传透!你這毒婦竟也來了耘沼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤朱盐,失蹤者是張志新(化名)和其女友劉穎群嗤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兵琳,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡狂秘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年骇径,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片者春。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡破衔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钱烟,到底是詐尸還是另有隱情晰筛,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布拴袭,位于F島的核電站读第,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拥刻。R本人自食惡果不足惜怜瞒,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望般哼。 院中可真熱鬧吴汪,春花似錦、人聲如沸蒸眠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽楞卡。三九已至近刘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臀晃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工介劫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留徽惋,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓座韵,卻偏偏與公主長得像险绘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子誉碴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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