为了账号安全,请及时绑定邮箱和手机立即绑定

在Java多线程中如何使用CountDownLatch?

在Java多线程中如何使用CountDownLatch?

慕斯709654 2019-11-05 14:41:17
有人可以帮助我了解什么是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.");    }}
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

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


调用的任何线程(通常是应用程序的主线程)都CountDownLatch.await()将等到计数达到零或被另一个线程中断为止。所有其他线程在CountDownLatch.countDown()完成或准备就绪后都需要通过调用来递减计数。


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


编辑:


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


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


PS OP的问题有一个非常简单的示例,因此我没有列出。


查看完整回答
反对 回复 2019-11-05
?
慕村225694

TA贡献1880条经验 获得超4个赞

CountDownLatchJava中的Java是一种同步器,它允许一个Thread 人等待一个或多个Threads才开始处理。

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

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

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

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

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

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

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

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


查看完整回答
反对 回复 2019-11-05
  • 3 回答
  • 0 关注
  • 425 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信