如果我们创建多个线程,希望他们在同一时刻启动,那么就会用到类似发令枪的功能,也就是countDownLatch它有两个重要的方法await()阻塞线程,countDown()每次调用会递减1,当减少为0的时候,会让所有的线程启动。
下面写个例子方便大家的理解,这个例子的大概意思就是说main线程作为发号员,发令枪一响,三个线程开始run。三个线程完成后,通知main线程完成,让main线程继续下面的操作。
public class TestCountDownLatch {
public static void main(String[] args) throws InterruptedException {
ExecutorService service = Executors.newFixedThreadPool(3);
final CountDownLatch cdOrder = new CountDownLatch(1);
final CountDownLatch cdAnswer = new CountDownLatch(3);
for (int i=0;i<3 ;i++) {
Runnable runnable = new Runnable() {
public void run () {
System.out.println("线程" + Thread.currentThread().getName() + "正准备接受命令");
try {
cdOrder.await();
System.out.println("线程" + Thread.currentThread().getName() + "已接受命令");
Thread.sleep(1000);
System.out.println("线程" + Thread.currentThread().getName() + "回应命令处理结果");
cdAnswer.countDown();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
service.execute(runnable);
}
Thread.sleep(1000);
System.out.println("线程" + Thread.currentThread().getName() + "即将发布命令");
cdOrder.countDown();
System.out.println("线程" + Thread.currentThread().getName() + "已发送命令,正在等待结果");
try {
cdAnswer.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("线程" + Thread.currentThread().getName() + "已收到所有响应结果");
service.shutdown();
}
}
运行结果如下图
线程pool-1-thread-1正准备接受命令
线程pool-1-thread-2正准备接受命令
线程pool-1-thread-3正准备接受命令
线程main即将发布命令
线程main已发送命令,正在等待结果
线程pool-1-thread-2已接受命令
线程pool-1-thread-1已接受命令
线程pool-1-thread-3已接受命令
线程pool-1-thread-2回应命令处理结果
线程pool-1-thread-3回应命令处理结果
线程pool-1-thread-1回应命令处理结果
线程main已收到所有响应结果