- 类似场景
- main进程中启动子线程,等待子线程执行完成后,main再执行
- 可以使用
join()
join()
的执行原理- 分清两个线程,调用join的线程和当前执行线程。
- 当前执行线程 当join的线程处于存活状态会一致 wait(0)
- join的线程在执行完毕后,会调用
notifyAll()
方法是JVM中实现的。
总结
- 当CoutDownLatch指定的数量被消耗完后,调用await()的线程才会向下执行
- 不可重复使用
同步屏障CyclicBarrier
new CyclicBarrier(int arg)
:当arg个线程都调用了CyclicBarrier的await()后,所有线程才往下执行new CyclicBarrier(int arg, Runnable r)
:当arg个线程都调用了CyclicBarrier的await()后,先执行 r任务,所有线程继续往下执行- 若在聚集线程过程中的某个线程被中断,所有等待和将要等待的线程都报
BrokenBarrierException
- 每次使用完本次聚集后,可以重复使用
- 场景介绍:一个Excel有4个sheet记录的时今年全部资金流水。需要统计每个sheet的总计。然后汇总。计算日均收入。、
- 与CountDownLatch不同
- CyclicBarrier可以重复使用
- CyclicBarrier是所有线程到某个点后,再同时进行,CountDown只控制一个线程
Barrier CountDownLatch