小编典典

Java多线程中如何使用CountDownLatch?

all

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

我对这个程序的工作原理不是很清楚。据我了解,所有三个线程同时启动,每个线程将在 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.");
    }

}

阅读 61

收藏
2022-06-28

共1个答案

小编典典

是的,你理解正确。 CountDownLatch以闩锁原理工作,主线程将等待直到门打开。一个线程等待 n 个
线程,在创建CountDownLatch.

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

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

编辑:

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

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

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

2022-06-28