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,当三个线程都达到屏障时,会打印一条消息,然后所有线程都会继续执行。

发表评论

后才能评论