CountDownLatch是java concurrent 包里一个用于并发流程控制的类。顾名思义,它是一个倒计数的计数器。给计数器初始化一个值,调用countdown()方法来原子的减小这个值,另外有一个await()方法一直阻塞等待这个值减为0,当减为0的时候解除阻塞。继续执行。
CountdownLatch是一个同步工具,有很多的用途
(1) 把计数1初始化为CountDownLatch的初值
做一个开关,或入口。有这样一个例子,比如赛马。裁判员线程发号施令,他持有countdown()函数,所有的赛马线程都调用await()阻塞等待施令。当countdown()调用, CountDownLatch变为0,所有的赛马线程解除阻塞,开始run.
final CountDownLatch startLatch= new CountDownLatch(1);
for(int i = 0; i < 10; ++i) {
Thread thread= newThread("worker thread "+ i) {
public void run() {
try{
startLatch.await();
}catch(InterruptedExceptione){
return;
} // do xxxx
}
};
thread.start();
} // do xxx
startLatch.countDown();
(2) 把计数初始化为N
这样可以使一个线程在N个线程完成某项操作之前一直等待,或者说等待某个线程完成N次操作。以赛马为例。终点统计员线程要等到N匹马到达终点后才汇总结果,所以他在await(),每当一个马达到终点,它就countdown(),当CountDownLatch变为0的时候,所有的马都到达终点了,await()解除阻塞,统计员统计结果。继续往下执行。
final int COUNT = 10;
final CountDownLatch completeLatch = newCountDownLatch(COUNT);
for (int i = 0; i < COUNT; ++i) {
Thread thread= newThread("worker thread "+ i) {
public void run() {
// do xxxx
completeLatch.countDown();
}
};
thread.start();
}
completeLatch.await();