当前位置: 首页 > 面试题库 >

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

季华茂
2023-03-14
问题内容

有人可以帮助我了解什么是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的问题有一个非常简单的示例,因此我没有列出。



 类似资料:
  • BilledLines=Integer.ParseInt(args[7]); Array=TaxCalc.Calculation(输入,y,BilledLines,); 返回数组; } taxouput函数是OSB中的多线程函数。现在,我想调用setup()和 cleanup(),以便setup()只对第一个线程调用,而 cleanup()只对最后一个线程调用。

  • 问题内容: 我正在尝试将Hibernate用于多线程应用程序,其中每个线程都检索一个对象并将其插入表中。我的代码如下所示。我每个线程都有本地hibernate会话对象,在每个InsertData中,我都执行beginTransaction和commit。 我面临的问题是很多次我收到“ org.hibernate.TransactionException:不支持嵌套事务” 由于我是hibernate

  • 问题内容: 是否有一种实际的方法可以在PHP中实现多线程模型,无论是真正的还是仅对其进行仿真。一段时间以前,建议您可以强制操作系统加载PHP可执行文件的另一个实例并处理其他同时进行的进程。 这样做的问题是,当PHP代码完成执行PHP实例后,它仍保留在内存中,因为无法从PHP中杀死它。因此,如果您正在模拟多个线程,则可以想象会发生什么。因此,我仍在寻找一种可以在PHP中有效完成或模拟多线程的方法。有

  • 问题内容: 我有如下方法: methodB可以正常工作吗?根据我的理解,methodB将附加methodA的事务,如果methodA在methodB之前退出该怎么办?我想事务只能提交methodA。但是methodB将不会提交,因为该事务之前已提交。 我可以对方法B使用@Transactional(propagation = Propagation.REQUIRES_NEW)。这可以使method

  • 我正在使用多线程执行插入操作。我使用了带注释的方法,我的方法是注释。但我无法执行插入操作,导致出现以下异常。 异常线程"Thread-21"javax.persistence.Transaction必需异常:在org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:96)在sun.reflect.Native

  • 有人能帮我理解什么是Java以及什么时候使用它吗? 我不太清楚这个程序是如何工作的。据我所知,所有三个线程都同时启动,每个线程在3000ms后都会调用CountDownLatch。所以倒计时会一个接一个地递减。闩锁变为零后,程序会打印“已完成”。也许我理解的方式不正确。 // -----------------------------------------------------