Java CountDownLatch應(yīng)用

Java的concurrent包里面的CountDownLatch其實可以把它看作一個計數(shù)器,只不過這個計數(shù)器的操作是原子操作,同時只能有一個線程去操作這個計數(shù)器,也就是同時只能有一個線程去減這個計數(shù)器里面的值。

你可以向CountDownLatch對象設(shè)置一個初始的數(shù)字作為計數(shù)值,任何調(diào)用這個對象上的await()方法都會阻塞,直到這個計數(shù)器的計數(shù)值被其他的線程減為0為止。

CountDownLatch的一個非常典型的應(yīng)用場景是:有一個任務(wù)想要往下執(zhí)行,但必須要等到其他的任務(wù)執(zhí)行完畢后才可以繼續(xù)往下執(zhí)行。假如我們這個想要繼續(xù)往下執(zhí)行的任務(wù)調(diào)用一個CountDownLatch對象的await()方法,其他的任務(wù)執(zhí)行完自己的任務(wù)后調(diào)用同一個CountDownLatch對象上的countDown()方法,這個調(diào)用await()方法的任務(wù)將一直阻塞等待,直到這個CountDownLatch對象的計數(shù)值減到0為止。

舉個例子,有三個工人在為老板干活,這個老板有一個習(xí)慣,就是當(dāng)三個工人把一天的活都干完了的時候,他就來檢查所有工人所干的活。記住這個條件:三個工人先全部干完活,老板才檢查。所以在這里用Java代碼設(shè)計兩個類,Worker代表工人,Boss代表老板,具體的代碼實現(xiàn)如下:

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 + "正在干活!");

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容