返回

CyclicBarrier与CountDownLatch有什么区别?

后端

CyclicBarrier 和 CountDownLatch 是 Java 并发编程中的两个重要类,它们都有助于协调多个线程之间的操作。但是,它们在使用上有不同的目的和特性,了解它们之间的区别对于在 Java 并发编程中做出正确的选择非常重要。

等待条件

CyclicBarrier 的等待条件是所有参与的线程都到达屏障点,然后它们才能继续执行。CountDownLatch 的等待条件是计数器减为 0,然后所有等待的线程才能继续执行。

重用性

CyclicBarrier 可以被重复使用,这意味着它可以在多个线程组之间共享。CountDownLatch 是一个一次性的类,一旦计数器减为 0,它就不能再被使用了。

线程数量

CyclicBarrier 需要知道参与的线程数量,以便在所有线程都到达屏障点后释放它们。CountDownLatch 不需要知道参与的线程数量,它只需要知道需要等待的次数。

使用场景

CyclicBarrier 适用于需要协调多个线程同时执行某个任务的情况,例如在所有线程都完成各自的任务后才开始下一个阶段的处理。CountDownLatch 适用于需要等待某个事件发生的情况,例如等待所有线程都完成任务或等待某个资源变得可用。

示例代码

CyclicBarrier 的示例代码如下:

import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierExample {

    public static void main(String[] args) {
        // 创建一个CyclicBarrier,它将等待4个线程到达屏障点
        CyclicBarrier barrier = new CyclicBarrier(4);

        // 创建4个线程,每个线程都会尝试到达屏障点
        for (int i = 0; i < 4; i++) {
            new Thread(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + "到达屏障点");
                    // 等待所有线程都到达屏障点
                    barrier.await();
                    System.out.println(Thread.currentThread().getName() + "继续执行");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

CountDownLatch 的示例代码如下:

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {

    public static void main(String[] args) {
        // 创建一个CountDownLatch,它将等待3个线程完成任务
        CountDownLatch latch = new CountDownLatch(3);

        // 创建3个线程,每个线程都会执行一个任务并调用countDown()方法
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + "开始执行任务");
                    // 执行任务
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName() + "完成任务");
                    // 调用countDown()方法,表示一个线程已完成任务
                    latch.countDown();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();
        }

        // 等待所有线程都完成任务
        try {
            latch.await();
            System.out.println("所有线程都已完成任务");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

总结

CyclicBarrier 和 CountDownLatch 是 Java 并发编程中的两个重要类,它们都有助于协调多个线程之间的操作。但是,它们在使用上有不同的目的和特性,了解它们之间的区别对于在 Java 并发编程中做出正确的选择非常重要。