MST

星途 面试题库

面试题:Java中CyclicBarrier的基本原理及简单应用

请简要阐述Java中CyclicBarrier的基本原理,并给出一个使用CyclicBarrier实现多线程在某一点同步,然后继续执行的简单代码示例。
12.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

CyclicBarrier基本原理

CyclicBarrier是Java并发包中的一个同步工具类,它允许一组线程互相等待,直到所有线程都到达某个公共屏障点(barrier point)。

其内部使用ReentrantLockCondition来实现线程的同步。当一个线程调用await()方法时,它会进入等待队列并被阻塞,同时记录当前到达屏障点的线程数量。当到达屏障点的线程数量达到构造函数中设定的parties数量时,CyclicBarrier会唤醒所有等待的线程,让它们继续执行。并且CyclicBarrier可以被重用,即所有线程通过屏障后,它可以再次使用。

代码示例

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

public class CyclicBarrierExample {
    public static void main(String[] args) {
        int numThreads = 3;
        CyclicBarrier barrier = new CyclicBarrier(numThreads, () -> {
            System.out.println("所有线程都已到达屏障点,继续执行。");
        });

        for (int i = 0; i < numThreads; i++) {
            new Thread(new Worker(barrier)).start();
        }
    }

    static class Worker implements Runnable {
        private final CyclicBarrier barrier;

        Worker(CyclicBarrier barrier) {
            this.barrier = barrier;
        }

        @Override
        public void run() {
            try {
                System.out.println(Thread.currentThread().getName() + " 开始工作。");
                // 模拟工作
                Thread.sleep((long) (Math.random() * 2000));
                System.out.println(Thread.currentThread().getName() + " 工作完成,等待其他线程。");
                barrier.await();
                System.out.println(Thread.currentThread().getName() + " 继续执行。");
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
}

在上述代码中:

  1. 创建了一个CyclicBarrier实例,设置parties为3,表示需要3个线程都到达屏障点才会触发后续操作。并且设置了一个Runnable任务,当所有线程到达屏障点时会执行该任务。
  2. 创建3个线程,每个线程模拟一段工作,完成工作后调用barrier.await()等待其他线程。当所有线程都调用await()后,会执行CyclicBarrier设置的Runnable任务,然后所有线程继续执行后续代码。