CyclicBarrier 类的作用是什么?请解释其工作原理和适用场景。
CyclicBarrier 是 Java 并发编程中的一个工具类,它可以用来实现多个线程之间的同步。CyclicBarrier 的字面意思是“循环屏障”,它可以让一组线程在所有线程都达到一个同步点(屏障)时再同时继续执行。
CyclicBarrier 提供了一个构造函数用于指定屏障的数量,即需要有多少个线程达到屏障时才能继续执行。它还提供了一个 await() 方法,当一个线程调用这个方法时,它会等待其他线程也达到屏障。当所有线程都达到屏障时,它们会被一起释放,然后 CyclicBarrier 会重置,以便于下一次使用。
CyclicBarrier 还可以接受一个可选的 Runnable 参数,当所有线程都达到屏障时,这个 Runnable 会在任何线程被释放之前执行,这可以用来做一些准备工作。
CyclicBarrier 的一个常见用途是在并行算法中,当多个线程需要进行某些计算,并且需要等待其他线程都完成计算后才能继续。另一个常见的用途是在模拟和测试中,可以让一组线程在一个特定的时间点同时开始执行。
下面是一个简单的示例:
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
public static void main(String[] args) {
// 创建一个屏障点,当有三个线程都达到屏障时,会执行传入的 Runnable
CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("所有线程都已达到屏障,继续执行..."));
for (int i = 0; i < 3; i++) {
new Thread(() -> {
try {
System.out.println("线程" + Thread.currentThread().getName() + "正在执行");
Thread.sleep(2000);
System.out.println("线程" + Thread.currentThread().getName() + "正在等待其他线程");
barrier.await(); // 等待其他线程
System.out.println("线程" + Thread.currentThread().getName() + "继续执行");
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
}
在这个示例中,我们创建了一个 CyclicBarrier,当三个线程都达到屏障时,会打印一条消息,然后所有线程都会继续执行。