在Java多线程中如何使用CountDownLatch?
有人可以帮助我了解什么是Java CountDownLatch以及何时使用它吗?
对于该程序的工作方式,我没有一个很清楚的想法。据我了解,所有三个线程同时启动,每个线程将在3000ms之后调用CountDownLatch。因此,递减计数将逐一递减。锁存器变为零后,程序将打印“ Completed”。也许我的理解方式不正确。
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.");
    }
}
回答:
是的,你理解正确。 CountDownLatch按照闩锁原理工作,主线程将等待直到门打开。一个线程等待n个线程(创建时指定)CountDownLatch。
任何调用,通常是应用程序的主线程,都CountDownLatch.await()将等待直到计数达到零或被另一个线程中断为止。所有其他线程在CountDownLatch.countDown()完成或准备就绪时都需要通过调用来递减计数。
一旦计数达到零,等待线程就会继续。的缺点/优点之一CountDownLatch是不可重用:一旦计数达到零,就不能再使用CountDownLatch了。
编辑:
使用CountDownLatch当一个线程(比如主线程),需要等待一个或多个线程来完成,才能继续处理。
CountDownLatch在Java 中使用的经典示例是使用服务体系结构的服务器端核心Java应用程序,其中多个线程提供了多个服务,并且在所有服务都成功启动之前,该应用程序无法开始处理。
PS OP的问题有一个非常简单的示例,因此我没有列出。
以上是 在Java多线程中如何使用CountDownLatch? 的全部内容, 来源链接: utcz.com/qa/426491.html








