關於CountDownLatch的舉例
- 假如我們要建造一個房子,首先我們給準備建築材料開啓一個線程,選擇建築地點開啓一個線程,招聘工人開啓一個線程,每個線程完成任務就進行彙報,當所有線程都彙報完成時我們就可以開工建房子了示例代碼如下
public class MyCountDownLatch {
public static void main(String[] args) {
/*此處相當於造房子的總設計師,總共需要做幾項前置準備由總設計師說了算*/
CountDownLatch count = new CountDownLatch(3);
new Thread(() -> {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("報告建築材料已經準備完畢");
/*此處相當於沒個線程完成一個任務就向總設計師彙報*/
count.countDown();
}).start();
new Thread(()->{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("報告建築工地已選擇完畢");
/*此處相當於沒個線程完成一個任務就向總設計師彙報*/
count.countDown();
}).start();
new Thread(()->{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("報告工人已招聘完畢");
/*此處相當於沒個線程完成一個任務就向總設計師彙報*/
count.countDown();
}).start();
try {
/*這裏相當於監工,只有當所有前置準備都完成時,流程纔可以向下走,即開工建房子*/
count.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(()->{
System.out.println("所有前置準備已完成,現在開工建房子");
}).start();
}
}
上面的count.await();
語句相當於阻塞了住線程和開工造房子的線程,程序執行結果如下
關於CountDownLatch的官方解釋
- CountDownLatch在jdk1.5被引入的,在java.util.concurrent包下,CountDownLatch能夠使一個線程等待其他線程完成各自的工作後再執行,CountDownLatch是通過一個計數器來實現的,計數器的初始值爲線程的數量。每當一個線程完成了自己的任務後,計數器的值就會減1。當計數器值到達0時,它表示所有的線程已經完成了任務,然後等待的線程就可以恢復執行任務了