在JUC包中为我们提供了一个同步工具类能够很好的模拟这类场景,它就是CyclicBarrier类。利用CyclicBarrier类可以实现一组线程相互等待,当所有线程都到达某个屏障点后再进行后续的操作。下图演示了这一过程。
20181218144511688.gif
CyclicBarrier 字面意思是“可重复使用的栅栏”,CyclicBarrier 相比 CountDownLatch 来说,要简单很多,其源码没有什么高深的地方,它是 ReentrantLock 和 Condition 的组合使用。

测试案例

  1. package com.personal.test.countdownlatch;
  2. import lombok.SneakyThrows;
  3. import java.util.concurrent.CyclicBarrier;
  4. public class CyclicBarrier00 {
  5. public void test00() {
  6. CyclicBarrier cyclicBarrier = new CyclicBarrier(2);
  7. new Thread(new Runnable() {
  8. @SneakyThrows
  9. @Override
  10. public void run() {
  11. System.out.println(Thread.currentThread().getName() + " 准备开始");
  12. cyclicBarrier.await();
  13. System.out.println(Thread.currentThread().getName() + " 处理完成");
  14. }
  15. }).start();
  16. new Thread(new Runnable() {
  17. @SneakyThrows
  18. @Override
  19. public void run() {
  20. System.out.println(Thread.currentThread().getName() + " 准备开始");
  21. Thread.sleep(2000);
  22. cyclicBarrier.await();
  23. System.out.println(Thread.currentThread().getName() + " 处理完成");
  24. }
  25. }).start();
  26. }
  27. public static void main(String[] args) {
  28. CyclicBarrier00 cyclicBarrier00 = new CyclicBarrier00();
  29. cyclicBarrier00.test00();
  30. }
  31. }

参考资料

深入理解CyclicBarrier原理