在Java中,`CyclicBarrier`是一种同步辅助工具,它允许一组线程相互等待,直到所有线程都达到某个屏障点(barrier point)。一旦所有线程都到达这个点,它们会被同时唤醒并继续执行。`CyclicBarrier`特别适用于那些需要多个线程协同工作以完成任务的场景。
CyclicBarrier 的基本概念
`CyclicBarrier`的构造函数接受一个整数参数`parties`,表示需要等待的线程数量。此外,还可以提供一个`Runnable`对象,这个对象将在所有线程到达屏障点时执行。`CyclicBarrier`内部使用一个计数器`count`来跟踪当前已经到达的线程数量。
CyclicBarrier 的主要方法
`await()`: 使当前线程等待,直到所有线程都到达屏障点。如果线程在等待时被中断,将抛出`InterruptedException`。如果`CyclicBarrier`被破坏(例如,尝试重置一个已经被重置的`CyclicBarrier`),将抛出`BrokenBarrierException`。
`dowait()`: 是`await()`方法的一个变种,它不会抛出`InterruptedException`,但会抛出`BrokenBarrierException`(如果`CyclicBarrier`被破坏)。
CyclicBarrier 的使用场景
`CyclicBarrier`常用于以下场景:
多线程协同工作:当多个线程需要协同完成一个任务,且每个线程必须在其他线程开始执行后才能继续执行时。
数据分片处理:当需要将一个大任务分割成多个小任务,由多个线程分别处理,并在所有线程完成处理后合并结果时。
CyclicBarrier 的实战示例
```java
import java.util.concurrent.CyclicBarrier;
public class DataProcessingTask {
private static final int THREAD_COUNT = 3;
private static final CyclicBarrier BARRIER = new CyclicBarrier(
THREAD_COUNT,
() -> System.out.println("\n===所有数据处理完毕,开始汇总===\n")
);
static class DataProcessor implements Runnable {
private final String name;
private final List
public DataProcessor(String name, List this.name = name; this.data = data; } @Override public void run() { try { // 第一阶段:数据加载 System.out.printf("%s开始加载数据...\n", name); // 模拟数据加载过程 Thread.sleep((long) (Math.random() * 1000)); // 第二阶段:数据处理 System.out.printf("%s开始处理数据...\n", name); // 模拟数据处理过程 Thread.sleep((long) (Math.random() * 1000)); // 到达屏障点 BARRIER.await(); // 第三阶段:数据汇总 System.out.printf("%s完成数据处理,开始汇总...\n", name); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } } } public static void main(String[] args) { List for (int i = 0; i < THREAD_COUNT; i++) { processors.add(new DataProcessor("处理器" + (i + 1), new ArrayList<>())); new Thread(processors.get(i)).start(); } } } ``` 在这个示例中,我们创建了3个`DataProcessor`线程,每个线程负责处理一部分数据。当所有线程都完成数据处理后,它们会在`CyclicBarrier`处等待,直到所有线程都到达屏障点,然后一起继续执行数据汇总操作。 总结 `CyclicBarrier`是Java并发编程中一个非常实用的工具,它可以帮助我们控制多个线程的执行流程,确保它们在正确的时机协同工作。通过合理地使用`CyclicBarrier`,我们可以编写出更加高效和可靠的并发程序。