CountDownLatch是一种java.util.concurrent包下一个同步工具类。它可以让≥1个线程等待一组其它线程的操作执行完成。
【翻译】CountDown是倒计时,Latch是门闩。
1、CountDownLatch end = new CountDownLatch(N); // 新建倒计时锁,容量是N
2、end.await() // 阻塞线程。直到调用N次end.countDown() 方法才释放线程
3、end.countDown() // 倒数1个数。(计算调用次数是所有线程调用次数的总和)
import java.util.concurrent.CountDownLatch;
public class Test {
// 模拟了100米赛跑,10名选手已经准备就绪,只等裁判一声令下。当所有人都到达终点时,比赛结束。
public static void main(String[] args) throws InterruptedException {
// 开始的倒数锁
final CountDownLatch begin = new CountDownLatch(1);
// 结束的倒数锁
final CountDownLatch end = new CountDownLatch(10);
for (int index = 0; index < 10; index++) {
final int NO = index + 1;
Runnable run = new Runnable() {
public void run() {
try {
// 如果当前计数为零,则此方法立即返回。
begin.await();// 等待begin的信号
Thread.sleep((long) (Math.random() * 10000));
System.out.println("No." + NO + " arrived");
} catch (InterruptedException ignored) {
} finally {
end.countDown(); // 每个选手到达终点时,end就减一
}
}
};
new Thread(run).start();
}
System.out.println("Game Start");
begin.countDown(); // begin减一,开始游戏
end.await(); // 等待end变为0,即所有选手到达终点
System.out.println("Game Over");
}
}
运行结果
Game Start
No.7 arrived
No.2 arrived
No.8 arrived
No.1 arrived
No.3 arrived
No.5 arrived
No.9 arrived
No.6 arrived
No.10 arrived
No.4 arrived
Game Over
Ref.