簡介
一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。用給定的計數 初始化 CountDownLatch。由於調用了 countDown() 方法,所以在當前計數到達零之前,await 方法會一直受阻塞。之後,會釋放所有等待的線程,await 的所有後續調用都將立即返回。這種現象只出現一次——計數無法被重置。如果需要重置計數,請考慮使用 CyclicBarrier。
實例
通過CountDownLatch來實現主線程和子線程通信,主線程發送命令啟動子線程,子線程全部完成後通知主線程。
代碼:
public class CountDownLatchTest {
public static void main(String[] args) {
final CountDownLatch cdOrder = new CountDownLatch(1);
final CountDownLatch cdAnswer = new CountDownLatch(3);
ExecutorService threadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 3; i++) {
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+"正在等待命令");
cdOrder.await();//子線程等待
System.out.println(Thread.currentThread().getName()+"接受命令");
Thread.sleep(new Random().nextInt(10000));
System.out.println(Thread.currentThread().getName()+"發出應答");
cdAnswer.countDown();//當cdAnswer為0時,主線程收到回復
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
threadPool.execute(runnable);
}
/*
* 主線程
*/
try {
Thread.sleep(new Random().nextInt(10000));
System.out.println(Thread.currentThread().getName()+"即將發出命令");
System.out.println(Thread.currentThread().getName()+"發出命令");
cdOrder.countDown();//啟動子線程
cdAnswer.await();//等待子線程回復
System.out.println(Thread.currentThread().getName()+"收到應答");
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
threadPool.shutdown();
}
}