pool-1-thread-2 到达终点
pool-1-thread-3 正在全力冲刺
pool-1-thread-3 到达终点
pool-1-thread-1 正在全力冲刺
pool-1-thread-1 到达终点
pool-1-thread-4 正在全力冲刺
pool-1-thread-4 到达终点
pool-1-thread-5 正在全力冲刺
pool-1-thread-5 到达终点
pool-1-thread-6 正在全力冲刺
pool-1-thread-6 到达终点
所有运动员到达终点,比赛结束!
pool-1-thread-2 运动员等待裁判员响哨!!!
pool-1-thread-3 运动员等待裁判员响哨!!!
pool-1-thread-1 运动员等待裁判员响哨!!!
pool-1-thread-4 运动员等待裁判员响哨!!!
pool-1-thread-5 运动员等待裁判员响哨!!!
pool-1-thread-6 运动员等待裁判员响哨!!!
裁判员发号施令啦!!!
pool-1-thread-2 正在全力冲刺
pool-1-thread-2 到达终点
pool-1-thread-3 正在全力冲刺
pool-1-thread-3 到达终点
pool-1-thread-1 正在全力冲刺
pool-1-thread-1 到达终点
pool-1-thread-4 正在全力冲刺
pool-1-thread-4 到达终点
pool-1-thread-5 正在全力冲刺
pool-1-thread-5 到达终点
pool-1-thread-6 正在全力冲刺
pool-1-thread-6 到达终点
所有运动员到达终点,比赛结束!
该示例代码中设置了两个 CountDownLatch,第一个 endSignal 用于控制让 main
线程(裁判员)必须等到其他线程(运动员)让 CountDownLatch 维护的数值 N
减到 0 为止。另一个 startSignal 用于让 main 线程对其他线程进行“发号施
令”,startSignal 引用的 CountDownLatch 初始值为 1,而其他线程执行的 run
方法中都会先通过 startSignal.await()让这些线程都被阻塞,直到 main 线程
通过调用 startSignal.countDown();,将值 N 减 1,CountDownLatch 维护的
数值 N 为 0 后,其他线程才能往下执行,并且,每个线程执行的 run 方法中
都会通过 endSignal.countDown();对 endSignal 维护的数值进行减一,由于往
线程池提交了 6 个任务,会被减 6 次,所以 endSignal 维护的值最终会变为
0,因此 main 线程在 latch.await();阻塞结束,才能继续往下执行。