CyclicBarrier 是 Java 并发包 java.util.concurrent 中的一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达一个屏障(barrier)点。CyclicBarrier 特别适用于那些需要多个线程协同工作,并且在继续执行之前需要等待其他线程完成的场景。
初始化:
CyclicBarrier 时,需要指定一个整数 parties,表示需要等待的线程数量。Runnable 任务,这个任务会在所有线程到达屏障时执行。到达屏障:
await() 方法来表示它已经到达屏障。await() 时,它会进入等待状态,直到所有指定的线程都调用了 await()。屏障动作:
CyclicBarrier 时提供了 Runnable 任务,那么当所有线程都到达屏障时,这个任务会被执行一次。重用:
CyclicBarrier 是可重用的。一旦所有线程都到达了一个屏障点,屏障可以被重置并用于下一轮的同步。以下是一个简单的示例,展示了如何使用 CyclicBarrier:
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
public static void main(String[] args) {
int numberOfThreads = 3;
CyclicBarrier barrier = new CyclicBarrier(numberOfThreads, () -> {
System.out.println("All threads have reached the barrier");
});
for (int i = 0; i < numberOfThreads; i++) {
new Thread(new Worker(barrier), "Thread-" + i).start();
}
}
static class Worker implements Runnable {
private final CyclicBarrier barrier;
public Worker(CyclicBarrier barrier) {
this.barrier = barrier;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " is waiting at the barrier");
barrier.await();
System.out.println(Thread.currentThread().getName() + " has crossed the barrier");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Thread-0 is waiting at the barrier
Thread-1 is waiting at the barrier
Thread-2 is waiting at the barrier
All threads have reached the barrier
Thread-0 has crossed the barrier
Thread-1 has crossed the barrier
Thread-2 has crossed the barrier
CyclicBarrier 使用内部锁和条件变量来实现线程间的同步,因此在使用时需要注意避免死锁。CyclicBarrier 的 await() 方法可能会抛出 InterruptedException 和 BrokenBarrierException,需要进行适当的异常处理。通过合理使用 CyclicBarrier,可以有效地协调多个线程的执行,确保它们在继续执行之前都达到了某个同步点。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。