CountDownLatch是JAVA提供在java.util.concurrent包下的一個輔助類捞魁。
內(nèi)部有一個計數(shù)器
- 計數(shù)器的操作是原子操作俐东,即同時只能有一個線程去操作這個計數(shù)器。
- CountDownLatch通過構(gòu)造函數(shù)傳入計數(shù)器的初始化值
- 調(diào)用者可以通過調(diào)用CounDownLatch對象的cutDown()方法,來使計數(shù)減1
- 如果某線程調(diào)用了CountDownLatch對象上的await()方法,那么此調(diào)用線程將一直阻塞在這里,直到別的線程通過cutDown方法婆跑,將計數(shù)減到0,才可以繼續(xù)執(zhí)行
一個使用示例
我們假設(shè)在生產(chǎn)線上要生產(chǎn)一臺電腦(由主板谱秽、顯示器洽蛀、內(nèi)存、顯卡疟赊、CPU郊供、鍵盤、鼠標(biāo)近哟、機箱8個部分組成)驮审,電腦的各部件由不同的工作人員生產(chǎn)完成,最后在生產(chǎn)線上把各部件組裝完成一臺電腦
public class Worker implements Runnable {
private static final Random random = new Random();
private String spareParts;
private CountDownLatch countDownLatch;
public Worker(String spareParts,CountDownLatch countDownLatch){
this.spareParts = spareParts;
this.countDownLatch = countDownLatch;
}
public void run() {
try {
Thread.sleep(random.nextInt(10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("完成部件["+spareParts+"]生產(chǎn)<础疯淫!");
countDownLatch.countDown();
}
}
public class ProductionLine {
public static void main(String[] args) throws InterruptedException {
System.out.println("開始生產(chǎn)電腦......");
CountDownLatch countDownLatch = new CountDownLatch(8);
//主板、顯示器戳玫、內(nèi)存熙掺、顯卡、CPU咕宿、鍵盤币绩、鼠標(biāo)蜡秽、機箱
new Thread(new Worker("主板", countDownLatch)).start();
new Thread(new Worker("CPU", countDownLatch)).start();
new Thread(new Worker("內(nèi)存", countDownLatch)).start();
new Thread(new Worker("顯示器", countDownLatch)).start();
new Thread(new Worker("顯卡", countDownLatch)).start();
new Thread(new Worker("電源", countDownLatch)).start();
new Thread(new Worker("鍵盤", countDownLatch)).start();
new Thread(new Worker("鼠標(biāo)", countDownLatch)).start();
countDownLatch.await();//等待,直到所有的部件都生產(chǎn)出來
System.out.println("利用各個部件組裝一臺電腦缆镣,完成生產(chǎn)!!!");
}
}
結(jié)果輸出
開始生產(chǎn)電腦......
完成部件[電源]生產(chǎn)Q客弧!
完成部件[顯卡]生產(chǎn)6啊寞蚌!
完成部件[顯示器]生產(chǎn)!钠糊!
完成部件[CPU]生產(chǎn)P印!
完成部件[主板]生產(chǎn)C呗臁煞聪!
完成部件[鍵盤]生產(chǎn)!逝慧!
完成部件[內(nèi)存]生產(chǎn)!啄糙!
完成部件[鼠標(biāo)]生產(chǎn)5殉肌!
利用各個部件組裝一臺電腦隧饼,完成生產(chǎn)!!!
在多線程協(xié)作工作時沈堡,當(dāng)有線程需要等待其他線程完成某個操作,才能往下執(zhí)行時就可以用到此類進行協(xié)調(diào)處理