返回

Java 多线程:探索 CyclicBarrier 同步工具类

Android

在并行编程领域,同步是协调并发执行至关重要的一方面。在 Java 中,CyclicBarrier 是一种有用的同步工具类,它允许一组线程相互等待,直到达到某个公共屏障点。

CyclicBarrier 的工作原理

CyclicBarrier 就像一场比赛的起跑线。它让一组线程在达到某个特定点之前都处于等待状态。当所有线程都到达这个点时,屏障就会打开,所有线程都可以继续执行。

与 CountDownLatch 不同,CyclicBarrier 在释放线程等待后可以重新使用。这意味着它可以用于协调多个同步点,而无需每次都创建新的屏障。

CyclicBarrier 的用法

使用 CyclicBarrier 非常简单:

  1. 创建 CyclicBarrier: 创建一个 CyclicBarrier 对象,并指定屏障点的线程数。
  2. 调用 await() 方法: 当线程需要等待屏障时,调用 await() 方法。这个方法会一直阻塞,直到屏障点达到。
  3. 重置屏障: 屏障点达到后,可以调用 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 可以成为并行应用程序中同步需求的宝贵工具。