CyclicBarrier 使用详解

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/

点赞(32) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部