编写一个示例程序,展示如何使用 CyclicBarrier 类进行多线程同步和协作。

CyclicBarrier 允许一组线程互相等待,直到它们都到达某个公共屏障点 (common barrier point)。当线程到达屏障点时,它们将被阻塞,直到所有线程都到达屏障点,然后所有线程将被释放,屏障将被重置。

下面是一个简单的使用示例,把一个大的任务拆分成几个小任务并行执行,所有小任务执行完毕后,再执行主任务。

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierExample {
    public static void main(String[] args) {
        // 创建 CyclicBarrier 对象,并设置主任务
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new Runnable() {
            @Override
            public void run() {
                System.out.println("主任务执行!");
            }
        });

        // 创建并启动 3 个子任务
        for (int i = 0; i < 3; i++) {
            new Thread(new SubTask(cyclicBarrier)).start();
        }
    }

    static class SubTask implements Runnable {
        private CyclicBarrier cyclicBarrier;

        public SubTask(CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier = cyclicBarrier;
        }

        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + " 子任务开始执行");
            try {
                Thread.sleep(3000); // 模拟耗时操作
                System.out.println(Thread.currentThread().getName() + " 子任务执行完毕,等待其他任务...");
                cyclicBarrier.await(); // 到达屏障点,等待其他线程
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " 所有任务完成,继续执行...");
        }
    }
}

在上述例子中,我们创建了一个 CyclicBarrier,设置了 3 个参与者,也就是说需要有 3 个线程调用 await() 方法才会触发屏障打开,完成主任务的执行。每个子任务在完成自己的工作后会调用 await() 方法,等待其他线程完成各自的工作。

发表评论

后才能评论