在JUC包中为我们提供了一个同步工具类能够很好的模拟这类场景,它就是CyclicBarrier类。利用CyclicBarrier类可以实现一组线程相互等待,当所有线程都到达某个屏障点后再进行后续的操作。下图演示了这一过程。
CyclicBarrier 字面意思是“可重复使用的栅栏”,CyclicBarrier 相比 CountDownLatch 来说,要简单很多,其源码没有什么高深的地方,它是 ReentrantLock 和 Condition 的组合使用。
测试案例
package com.personal.test.countdownlatch;import lombok.SneakyThrows;import java.util.concurrent.CyclicBarrier;public class CyclicBarrier00 {public void test00() {CyclicBarrier cyclicBarrier = new CyclicBarrier(2);new Thread(new Runnable() {@SneakyThrows@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " 准备开始");cyclicBarrier.await();System.out.println(Thread.currentThread().getName() + " 处理完成");}}).start();new Thread(new Runnable() {@SneakyThrows@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " 准备开始");Thread.sleep(2000);cyclicBarrier.await();System.out.println(Thread.currentThread().getName() + " 处理完成");}}).start();}public static void main(String[] args) {CyclicBarrier00 cyclicBarrier00 = new CyclicBarrier00();cyclicBarrier00.test00();}}
