Java中CyclicBarrier工具类代码理解
时间: 2024-04-04 17:13:29 浏览: 14
CyclicBarrier 是 Java 中的一个同步工具类,它允许一组线程互相等待,直到所有线程都到达某个屏障点,然后再一起继续执行。CyclicBarrier 可以循环使用,因此称之为循环屏障。
下面是 CyclicBarrier 工具类的基本使用示例:
```java
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
public static void main(String[] args) {
// 创建一个 CyclicBarrier 实例,指定等待线程数和屏障动作
CyclicBarrier cyclicBarrier = new CyclicBarrier(3, () -> {
System.out.println("所有线程已到达屏障点,开始执行屏障动作");
});
// 创建 3 个线程,模拟多个线程同时到达屏障点
for (int i = 0; i < 3; i++) {
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + " 已到达屏障点,等待其他线程");
cyclicBarrier.await(); // 等待其他线程到达屏障点
System.out.println(Thread.currentThread().getName() + " 继续执行");
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
```
上述代码中,我们创建了一个 CyclicBarrier 实例,指定等待线程数和屏障动作。然后创建了 3 个线程,模拟多个线程同时到达屏障点,每个线程到达屏障点后等待其他线程,直到所有线程到达屏障点,才会继续执行。
在 CyclicBarrier 的构造函数中,我们指定了等待线程数为 3,也就是说,只有当 3 个线程都到达屏障点时,才会执行屏障动作。屏障动作是一个 Runnable 对象,它会在所有线程到达屏障点后执行一次。
在每个线程执行的代码中,我们调用了 CyclicBarrier 的 await() 方法,等待其他线程到达屏障点。当所有线程都到达屏障点后,await() 方法会返回,线程继续执行。
需要注意的是,CyclicBarrier 的 await() 方法可能会抛出 InterruptedException 和 BrokenBarrierException 异常,因此需要在 catch 块中处理这两个异常。