CyclicBarrier市怎、CountDownLatch、Semaphore的用法

CountDownLatch(線程計數(shù)器 )

CountDownLatch 類位于java.util.concurrent 包下干像,利用它可以實現(xiàn)類似計數(shù)器的功能驰弄。比如有一個任務(wù)A,它要等待其他4 個任務(wù)執(zhí)行完畢之后才能執(zhí)行什乙,此時就可以利用CountDownLatch來實現(xiàn)這種功能了已球。

final CountDownLatch latch = new CountDownLatch( 2 );
new Thread()
{
    public void run()
    {
        System.out.println( "子線程" + Thread.currentThread().getName() + "正在執(zhí)行" );
        Thread.sleep( 3000 );
        System.out.println( "子線程" + Thread.currentThread().getName() + "執(zhí)行完畢" );
        latch.countDown();
    };
}.start();
new Thread()
{
    public void run()
    {
        System.out.println( "子線程" + Thread.currentThread().getName() + "正在執(zhí)行" );
        Thread.sleep( 3000 );
        System.out.println( "子線程" + Thread.currentThread().getName() + "執(zhí)行完畢" );
        latch.countDown();
    };
}.start();
System.out.println( "等待2 個子線程執(zhí)行完畢..." );
latch.await();
System.out.println( "2 個子線程已經(jīng)執(zhí)行完畢" );
System.out.println( "繼續(xù)執(zhí)行主線程" );
}

CyclicBarrier(回環(huán)柵欄-等待至barrier 狀態(tài)再全部同時執(zhí)行)

字面意思回環(huán)柵欄智亮,通過它可以實現(xiàn)讓一組線程等待至某個狀態(tài)之后再全部同時執(zhí)行。叫做回環(huán)因為當(dāng)所有等待線程都被釋放以后阔蛉,CyclicBarrier 可以被重用状原。我們暫且把這個狀態(tài)就叫做barrier,當(dāng)調(diào)用await()方法之后颠区,線程就處于barrier 了。
CyclicBarrier 中最重要的方法就是await 方法器贩,它有2 個重載版本:

  1. public int await():用來掛起當(dāng)前線程朋截,直至所有線程都到達(dá)barrier 狀態(tài)再同時執(zhí)行后續(xù)任務(wù);
  2. public int await(long timeout, TimeUnit unit):讓這些線程等待至一定的時間唆姐,如果還有線程沒有到達(dá)barrier 狀態(tài)就直接讓到達(dá)barrier 的線程執(zhí)行后續(xù)任務(wù)廓八。
    具體使用如下胆描,另外CyclicBarrier 是可以重用的仗阅。
public static void main( String[] args )
{
    int n = 4;
    CyclicBarrier   barrier = new CyclicBarrier(n);
    for ( int i = 0; i < N; i++ )
        new Writer( barrier ).start();
}


static class Writer extends Thread {
    private CyclicBarrier cyclicBarrier;
    public Writer( CyclicBarrier cyclicBarrier )
    {
        this.cyclicBarrier = cyclicBarrier;
    }


    @Override
    public void run()
    {
        try {
            Thread.sleep( 5000 ); /* 以睡眠來模擬線程需要預(yù)定寫入數(shù)據(jù)操作 */
            System.out.println( " 線程" + Thread.currentThread().getName() + " 寫入數(shù)據(jù)完畢减噪,等待其他線程寫入完畢" );
            cyclicBarrier.await();
        } catch ( InterruptedException e ) {
            e.printStackTrace();
        }catch ( BrokenBarrierException e ) {
            e.printStackTrace();
        }
        System.out.println( "所有線程寫入完畢车吹,繼續(xù)處理其他任務(wù),比如數(shù)據(jù)操作" );
    }
}

Semaphore(信號量-控制同時訪問的線程個數(shù))

Semaphore 翻譯成字面意思為 信號量朝卒,Semaphore 可以控制同時訪問的線程個數(shù)乐埠,通過acquire() 獲取一個許可,如果沒有就等待瑞眼,而 release() 釋放一個許可棵逊。
Semaphore 類中比較重要的幾個方法:

  1. public void acquire(): 用來獲取一個許可,若無許可能夠獲得辆影,則會一直等待,直到獲得許可锯蛀。
  2. public void acquire(int permits):獲取permits 個許可
  3. public void release() { } :釋放許可键菱。注意,在釋放許可之前拭抬,必須先獲獲得許可侵蒙。
  4. public void release(int permits) { }:釋放permits 個許可上面4 個方法都會被阻塞,如果想立即得到執(zhí)行結(jié)果算凿,可以使用下面幾個方法。
  5. public boolean tryAcquire():嘗試獲取一個許可婚夫,若獲取成功署鸡,則立即返回true,若獲取失敗靴庆,則立即返回false
  6. public boolean tryAcquire(long timeout, TimeUnit unit):嘗試獲取一個許可炉抒,若在指定的時間內(nèi)獲取成功,則立即返回true焰薄,否則則立即返回false
  7. public boolean tryAcquire(int permits):嘗試獲取permits 個許可蛤奥,若獲取成功,則立即返回true凡桥,若獲取失敗,則立即返回false
  8. public boolean tryAcquire(int permits, long timeout, TimeUnit unit): 嘗試獲取permits個許可啊掏,若在指定的時間內(nèi)獲取成功衰猛,則立即返回true,否則則立即返回false
  9. 還可以通過availablePermits()方法得到可用的許可數(shù)目娜睛。
    例子:若一個工廠有5 臺機(jī)器卦睹,但是有8 個工人,一臺機(jī)器同時只能被一個工人使用障斋,只有使用完了,其他工人才能繼續(xù)使用垃环。那么我們就可以通過Semaphore 來實現(xiàn):
int n = 8; /* 工人數(shù) */
Semaphore semaphore = new Semaphore(5); /* 機(jī)器數(shù)目 */
for(int i = 0; i < N; i++) new Worker(i, semaphore).start();
}
static class Worker extends Thread
{
    private int num;
    private Semaphore semaphore;
    public Worker(int num, Semaphore semaphore)
    {
        this.num = num;
        this.semaphore = semaphore;
    }@
    Override
    public void run()
    {
        try
        {
            semaphore.acquire();
            System.out.println("工人" + this.num + "占用一個機(jī)器在生產(chǎn)...");
            Thread.sleep(2000);
            System.out.println("工人" + this.num + "釋放出機(jī)器");
            semaphore.release();
        }
        catch(InterruptedException e)
        {
            e.printStackTrace();
        }
    }

CountDownLatch 和CyclicBarrier 都能夠?qū)崿F(xiàn)線程之間的等待遂庄,只不過它們側(cè)重點不同:
CountDownLatch 一般用于某個線程A 等待若干個其他線程執(zhí)行完任務(wù)之后,它才執(zhí)行;而CyclicBarrier 一般用于一組線程互相等待至某個狀態(tài)只磷,然后這一組線程再同時執(zhí)行;
另外泌绣,CountDownLatch 是不能夠重用的预厌,而CyclicBarrier 是可以重用的。
Semaphore 其實和鎖有點類似苗沧,它一般用于控制對某組資源的訪問權(quán)限炭晒。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末网严,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子震束,更是在濱河造成了極大的恐慌垢村,老刑警劉巖割疾,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宏榕,死亡現(xiàn)場離奇詭異,居然都是意外死亡侵佃,警方通過查閱死者的電腦和手機(jī)麻昼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趣钱,“玉大人涌献,你說我怎么就攤上這事∈子校” “怎么了燕垃?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵枢劝,是天一觀的道長。 經(jīng)常有香客問我卜壕,道長您旁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任鹤盒,我火速辦了婚禮,結(jié)果婚禮上侦副,老公的妹妹穿的比我還像新娘侦锯。我一直安慰自己,他們只是感情好秦驯,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布尺碰。 她就那樣靜靜地躺著,像睡著了一般译隘。 火紅的嫁衣襯著肌膚如雪亲桥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天固耘,我揣著相機(jī)與錄音题篷,去河邊找鬼。 笑死厅目,一個胖子當(dāng)著我的面吹牛番枚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播璧瞬,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼户辫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嗤锉?” 一聲冷哼從身側(cè)響起渔欢,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘟忱,沒想到半個月后奥额,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡访诱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年垫挨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片触菜。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡九榔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哲泊,我是刑警寧澤剩蟀,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站切威,受9級特大地震影響育特,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜先朦,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一缰冤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喳魏,春花似錦棉浸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至迂苛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鼓择,已是汗流浹背三幻。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留呐能,地道東北人念搬。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像摆出,于是被迫代替她去往敵國和親朗徊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359