返回
Java 多线程:探索 CyclicBarrier 同步工具类
Android
2023-12-12 16:58:15
在并行编程领域,同步是协调并发执行至关重要的一方面。在 Java 中,CyclicBarrier 是一种有用的同步工具类,它允许一组线程相互等待,直到达到某个公共屏障点。
CyclicBarrier 的工作原理
CyclicBarrier 就像一场比赛的起跑线。它让一组线程在达到某个特定点之前都处于等待状态。当所有线程都到达这个点时,屏障就会打开,所有线程都可以继续执行。
与 CountDownLatch 不同,CyclicBarrier 在释放线程等待后可以重新使用。这意味着它可以用于协调多个同步点,而无需每次都创建新的屏障。
CyclicBarrier 的用法
使用 CyclicBarrier 非常简单:
- 创建 CyclicBarrier: 创建一个 CyclicBarrier 对象,并指定屏障点的线程数。
- 调用 await() 方法: 当线程需要等待屏障时,调用 await() 方法。这个方法会一直阻塞,直到屏障点达到。
- 重置屏障: 屏障点达到后,可以调用 reset() 方法来重置屏障,以便可以再次使用。
CyclicBarrier 的示例
以下是一个使用 CyclicBarrier 的示例:
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
public static void main(String[] args) {
// 创建一个屏障,等待 3 个线程
CyclicBarrier barrier = new CyclicBarrier(3);
// 创建 3 个线程
Thread t1 = new Thread(() -> {
try {
// 线程 1 等待屏障
barrier.await();
System.out.println("线程 1 已通过屏障");
} catch (Exception e) {
e.printStackTrace();
}
});
Thread t2 = new Thread(() -> {
try {
// 线程 2 等待屏障
barrier.await();
System.out.println("线程 2 已通过屏障");
} catch (Exception e) {
e.printStackTrace();
}
});
Thread t3 = new Thread(() -> {
try {
// 线程 3 等待屏障
barrier.await();
System.out.println("线程 3 已通过屏障");
} catch (Exception e) {
e.printStackTrace();
}
});
// 启动线程
t1.start();
t2.start();
t3.start();
}
}
在该示例中,创建了一个 CyclicBarrier,它将等待 3 个线程。然后,启动 3 个线程,每个线程都会调用 barrier.await() 方法来等待屏障。当所有 3 个线程都到达屏障时,屏障将打开,所有线程将继续执行。
CyclicBarrier 的优点
使用 CyclicBarrier 的主要优点包括:
- 线程同步: 它提供了一种机制来同步一组线程,确保它们在一个特定的点之前不会继续执行。
- 可重用性: 它可以在释放线程等待后重新使用,从而消除了创建多个屏障的需要。
- 灵活的屏障点: 允许指定自定义的屏障点,以满足特定的同步需求。
结论
CyclicBarrier 是 Java 中一个强大的同步工具类,它允许协调并发执行并确保线程在适当的时候继续执行。通过其简单易用的 API,CyclicBarrier 可以成为并行应用程序中同步需求的宝贵工具。