如何使用Java中的CyclicBarrier实现多线程协作?

2周前 (05-17 18:08)阅读1回复0
lrj
lrj
  • 管理员
  • 注册排名2
  • 经验值165595
  • 级别管理员
  • 主题33119
  • 回复0
楼主

CyclicBarrier简介

CyclicBarrier是Java中的一个同步工具,用于协调多个线程之间的任务,通常用于控制多个线程同时开始执行某项任务,等待所有线程都执行完毕后再执行下一步操作。

如何使用Java中的CyclicBarrier实现多线程协作?

CyclicBarrier可以看作是一个屏障,当线程到达屏障时,它将等待其他线程也到达屏障,直到所有线程都到达屏障后才执行下一步操作。

CyclicBarrier的用法

CyclicBarrier的构造函数需要传入两个参数n和Runnable对象。

n表示线程数,即等待线程数,当n个线程都到达屏障时,所有线程才会继续执行。

Runnable对象则表示所有等待线程都到达屏障时需要执行的任务,可以为空。

CyclicBarrier的常用 *** 是await(),该 *** 使当前线程到达屏障并等待其他线程到达,当所有线程都到达屏障后,等待线程将一起继续执行。

CyclicBarrier还提供了reset() *** ,该 *** 可以让CyclicBarrier重新回到初始状态,可以重新使用。

CyclicBarrier的示例

下面是一个简单的示例,展示了CyclicBarrier的用法:

```

public class CyclicBarrierDemo {

private static final int THREAD_COUNT = 5;

private static final CyclicBarrier BARRIER = new CyclicBarrier(THREAD_COUNT, () -> System.out.println("所有线程都已到达屏障"));

public static void main(String[] args) throws InterruptedException {

ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUNT);

for (int i = 0; i < THREAD_COUNT; i++) {

executorService.execute(() -> {

System.out.println(Thread.currentThread().getName() + "已到达屏障");

try {

BARRIER.await();

System.out.println(Thread.currentThread().getName() + "已离开屏障");

} catch (InterruptedException | BrokenBarrierException e) {

e.printStackTrace();

}

});

}

executorService.shutdown();

}

}

以上示例创建了一个CyclicBarrier对象,等待5个线程到达屏障,当所有线程都到达后,将打印出“所有线程都已到达屏障”,然后所有线程将一起执行。

总结

CyclicBarrier是Java中的一个同步工具,用于协调多个线程之间的任务。

它可以看作是一个屏障,当等待的线程都到达屏障时,它们将一起继续执行。

CyclicBarrier的主要 *** 是await(),reset() *** 可以让CyclicBarrier重新回到初始状态。

CyclicBarrier非常适合用来协调多个线程同时执行某项任务的情况,例如批量处理文件、并行计算等。

0
回帖

如何使用Java中的CyclicBarrier实现多线程协作? 期待您的回复!

取消