CyclicBarrier 是 Java 中的一个同步辅助类,它允许一组线程在到达一个栅栏(barrier)之前进行相互等待,并在达到栅栏后继续执行。CyclicBarrier 具有可重用性,即在达到栅栏后,线程可以继续执行其他任务,然后再次到达栅栏等待其他线程。
CyclicBarrier 主要有两个构造方法:
```java
public CyclicBarrier(int parties, Runnable barrierAction)
public CyclicBarrier(int parties)
```
其中,parties 参数指定需要等待的线程数量,barrierAction 参数是一个可选的 Runnable,它会在所有线程都到达栅栏后执行一次。如果不需要在到达栅栏后执行任务,则可以传入 null。
CyclicBarrier 主要有两个方法:
```java
public int await() throws InterruptedException, BrokenBarrierException
public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException
```
这两个方法都会使当前线程等待直到所有线程都到达栅栏。如果所有线程都到达了栅栏,则所有线程都会继续执行。如果有任何一个线程抛出了 InterruptedException 或 BrokenBarrierException,则所有线程都会被中断。如果在指定的时间(timeout)内没有所有线程都到达栅栏,则会抛出 TimeoutException。这两个方法返回一个 int 值,表示当前线程是第几个到达栅栏的线程。
下面是一个简单的使用 CyclicBarrier 的示例,假设有 5 个线程需要同时执行,分别做一些工作,等所有线程都做完后,再继续下面的工作:
```java
public class CyclicBarrierExample {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(5, () -> {
System.out.println("所有线程已经到达栅栏");
});
for (int i = 0; i < 5; i++) {
final int idx = i;
new Thread(() -> {
System.out.println("线程 " + idx + " 开始工作");
try {
Thread.sleep(idx * 1000);
System.out.println("线程 " + idx + " 完成工作");
barrier.await();
System.out.println("线程 " + idx + " 继续执行");
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
```
上面的例子中,创建了一个 CyclicBarrier,并指定了需要等待的线程数量为 5。然后,创建了 5 个线程,并在每个线程中使用了 CyclicBarrier 的 await 方法,表示等待所有线程都到达栅栏。当所有线程都到达栅栏后,会执行 barrierAction,输出 "所有线程已经到达栅栏",然后所有线程都继续执行。
总结来说,CyclicBarrier 是一种非常有用的同步辅助类,它可以让多个线程协调工作,分步完成任务。我们可以使用它来实现比如多个线程分别读取大文件,并将读取结果汇总在一起等需要协调的场景。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/
发表评论 取消回复