一、关于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时,它表示所有的线程已经完成了任务,然后等待的线程就可以恢复执行任务了