面试题答案
一键面试CyclicBarrier基本原理
CyclicBarrier
是Java并发包中的一个同步工具类,它允许一组线程互相等待,直到所有线程都到达某个公共屏障点(barrier point)。
其内部使用ReentrantLock
和Condition
来实现线程的同步。当一个线程调用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();
}
}
}
}
在上述代码中:
- 创建了一个
CyclicBarrier
实例,设置parties
为3,表示需要3个线程都到达屏障点才会触发后续操作。并且设置了一个Runnable
任务,当所有线程到达屏障点时会执行该任务。 - 创建3个线程,每个线程模拟一段工作,完成工作后调用
barrier.await()
等待其他线程。当所有线程都调用await()
后,会执行CyclicBarrier
设置的Runnable
任务,然后所有线程继续执行后续代码。