一、CountDownLatch
二、举个栗子说明一下如何使用
public static void main(String[] args) {
CountDownLatch c = new CountDownLatch(3);
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+".............等待子任务的主线程1 "+ DateUtil.defaultFormatDate(null));
try {
c.await();
}catch (Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+".............等待子任务的主线程1 "+ DateUtil.defaultFormatDate(null));
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+".............等待子任务的主线程2 "+ DateUtil.defaultFormatDate(null));
try {
c.await();
}catch (Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+".............等待子任务的主线程2 "+ DateUtil.defaultFormatDate(null));
}
}).start();
for(int i = 0; i<c.getCount();i++){
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+ ".............子任务线程启动 "+ DateUtil.defaultFormatDate(null));
try {
Thread.sleep(2000);
}catch (Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+ ".............子任务线程结束 "+ DateUtil.defaultFormatDate(null));
c.countDown();
}
}).start();
}
}
输出
Thread-1.............等待子任务的主线程2 2021-04-02 17:31:37
Thread-2.............子任务线程启动 2021-04-02 17:31:37
Thread-3.............子任务线程启动 2021-04-02 17:31:37
Thread-4.............子任务线程启动 2021-04-02 17:31:37
Thread-0.............等待子任务的主线程1 2021-04-02 17:31:37
Thread-2.............子任务线程结束 2021-04-02 17:31:39
Thread-3.............子任务线程结束 2021-04-02 17:31:39
Thread-4.............子任务线程结束 2021-04-02 17:31:39
Thread-1.............等待子任务的主线程2 2021-04-02 17:31:39
Thread-0.............等待子任务的主线程1 2021-04-02 17:31:39
现象说明:主线程1、2先阻塞自己,等待子线程全部执行完,然后激活。
三、源码分析
3.1、CountDownLatch.await()是如何实现阻塞的