Java多线程中如何使用CountDownLatch?

新手上路,请多包涵

有人可以帮助我了解 Java CountDownLatch 是什么以及何时使用它吗?

我不太清楚这个程序是如何工作的。据我了解,所有三个线程同时启动,每个线程将在 3000 毫秒后调用 CountDownLatch。所以倒计时会一个一个递减。闩锁变为零后,程序打印“已完成”。可能我理解的方式不正确。

 import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class Processor implements Runnable {
    private CountDownLatch latch;

    public Processor(CountDownLatch latch) {
        this.latch = latch;
    }

    public void run() {
        System.out.println("Started.");

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        latch.countDown();
    }
}

// ---------------------------------------------- ——

 public class App {

    public static void main(String[] args) {

        CountDownLatch latch = new CountDownLatch(3); // coundown from 3 to 0

        ExecutorService executor = Executors.newFixedThreadPool(3); // 3 Threads in pool

        for(int i=0; i < 3; i++) {
            executor.submit(new Processor(latch)); // ref to latch. each time call new Processes latch will count down by 1
        }

        try {
            latch.await();  // wait until latch counted down to 0
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Completed.");
    }

}

原文由 amal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 453
2 个回答

是的,你没看错。 CountDownLatch 以闩锁原理工作,主线程将等待直到门打开。一个线程等待创建 CountDownLatch 时指定的 n 个 线程。

任何调用 CountDownLatch.await() 的线程,通常是应用程序的主线程,将等待计数达到零或被另一个线程中断。一旦完成或准备好,所有其他线程都需要通过调用 CountDownLatch.countDown() 进行倒计时。

一旦计数达到零,等待线程就会继续。 CountDownLatch 的缺点/优点之一是它不可重复使用:一旦计数达到零,你就不能再使用 CountDownLatch 了。

编辑:

使用 CountDownLatch 当一个线程(如主线程)需要等待一个或多个线程完成,然后才能继续处理。

在 Java 中使用 CountDownLatch 的一个经典示例是使用服务架构的服务器端核心 Java 应用程序,其中多个服务由多个线程提供,并且在所有服务都成功启动之前应用程序无法开始处理。

PS OP 的问题有一个非常简单的例子,所以我没有包括一个。

原文由 NikolaB 发布,翻译遵循 CC BY-SA 3.0 许可协议

CountDownLatch 在Java中是一种同步器,它允许一个 Thread 在开始处理之前等待一个或多个 Thread s。

CountDownLatch 闩锁原理工作,线程将等待直到门打开。一个线程等待 n 创建时指定的线程数 CountDownLatch

例如 final CountDownLatch latch = new CountDownLatch(3);

这里我们将计数器设置为 3。

调用 CountDownLatch.await() 的任何线程,通常是应用程序的主线程,将等待计数达到零或被另一个 Thread 中断。一旦完成或准备好工作,所有其他线程都需要通过调用 CountDownLatch.countDown() 进行倒计时。一旦计数达到零, Thread 等待开始运行。

这里的计数是通过 CountDownLatch.countDown() 方法递减的。

Thread 调用 await() 方法将等待,直到初始计数达到零。

要使计数为零,其他线程需要调用 countDown() 方法。一旦计数变为零,调用 await() 方法的线程将恢复(开始执行)。

CountDownLatch 的缺点是它不可重用:一旦计数变为零,它就不再可用。

原文由 Vishal Akkalkote 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题