CyclicBarrier
是 Java 并发包中的一个同步辅助类,用来让一组线程相互等待,直到所有线程都达到一个共同的屏障点,才继续执行。它通过构造函数可以接受一个 Runnable
类型的参数,当所有参与线程到达屏障点时会执行该 Runnable
。
在 CyclicBarrier(int parties, Runnable barrierAction)
构造函数中:
parties
参数表示需要等待的线程数量。barrierAction
参数是一个Runnable
,当所有线程都到达屏障点时会被执行。
关于这个 Runnable
是在哪个线程中执行的问题,根据 Java 的官方文档和实现细节:
barrierAction
会在最后一个到达屏障点的线程中执行。这意味着当有 n 个线程使用这个 CyclicBarrier
时,第 n 个(即最后一个到达的)线程不仅会解除屏障,还会负责执行 barrierAction
。
示例代码解释:
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
public static void main(String[] args) {
int numOfThreads = 3;
Runnable barrierAction = new Runnable() {
@Override
public void run() {
System.out.println("All threads have reached the barrier.");
}
};
CyclicBarrier barrier = new CyclicBarrier(numOfThreads, barrierAction);
for (int i = 0; i < numOfThreads; i++) {
new Thread(new Worker(barrier)).start();
}
}
static class Worker implements Runnable {
private CyclicBarrier barrier;
public Worker(CyclicBarrier barrier) {
this.barrier = barrier;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " is working...");
Thread.sleep(1000); // Simulate work
System.out.println(Thread.currentThread().getName() + " has finished work and is waiting at the barrier.");
barrier.await();
System.out.println(Thread.currentThread().getName() + " has crossed the barrier.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
在这个示例中,有三个线程在工作并等待在 CyclicBarrier
上。当所有三个线程都调用 barrier.await()
,最后一个到达屏障的线程会执行 barrierAction
,输出 “All threads have reached the barrier.”。
因此,Runnable barrierAction
不是在一个新线程中执行,而是由最后一个到达屏障的线程执行。