一个同步辅助类,它允许一个或多个线程一直等待一组其他线程执行结束后再做处理。用给定的计数初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即执行。 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行,实例代码如下:
package nc.com.thread.other;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountdownLatchTest {
//命令发出器
private static CountDownLatch orderCount= new CountDownLatch(1);
//等待命令结束相应器
private static CountDownLatch answerCount = new CountDownLatch(3);
//线程池
private static ExecutorService service = Executors.newCachedThreadPool();
public static void main(String[] args) throws Exception {
for(int i=0;i<3;i++){
Runnable r=new Runnable() {
public void run() {
System.out.println(""+Thread.currentThread().getName()+"到达目的地,等待司令发出命令...");
try {
orderCount.await();
System.out.println(""+Thread.currentThread().getName()+"得到司令发出的命令,go go ....");
Thread.sleep((long)(Math.random()*1000));
System.out.println(""+Thread.currentThread().getName()+"已完成司令发出的命令,归队go go ....");
answerCount.countDown();
} catch (Exception e) {
e.printStackTrace();
}
}
} ;
service.submit(r);
}
System.out.println(""+Thread.currentThread().getName()+"司令即将发出的命令");
orderCount.countDown();
System.out.println(""+Thread.currentThread().getName()+"司令已发出的命令,go go ....");
answerCount.await();
System.out.println(""+Thread.currentThread().getName()+"全部士兵已经完成司令命令归队");
service.shutdown();
}
}