版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/havebeenstand/article/details/83791419
1.概述
犹如倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当计数到达0时,则所有等待者开始执行。
2.代码示例
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
CountDownLatch orderLatch = new CountDownLatch(1);
CountDownLatch answerLatch = new CountDownLatch(3);
for(int i = 0;i < 3;i++){
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
System.out.println("线程"+Thread.currentThread().getName()+"正在等待接收命令");
//等待命令
orderLatch.await();
//接收命令(orderLatch的数量减到0)
System.out.println("线程"+Thread.currentThread().getName()+"已经接收命令");
//执行
Thread.sleep((long)Math.random()*10000);
//执行完毕
System.out.println("线程"+Thread.currentThread().getName()+"回应处理结果");
//执行完某个线程,使得answerCountDownLatch减1
answerLatch.countDown();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
executorService.execute(runnable);
}
try {
Thread.sleep((long)Math.random()*10000);
System.out.println("线程"+Thread.currentThread().getName()+"即将发布命令");
//发布命令
orderLatch.countDown();
System.out.println("线程"+Thread.currentThread().getName()+"已经发布命令,正在等待结果");
//等待所有的answer执行完
answerLatch.await();
//所有answer执行完毕,裁判拿到所有人的结果
System.out.println("线程"+Thread.currentThread().getName()+"已经获取到所有结果");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
executorService.shutdown();
}
运行结果: