当前位置: 首页 > 知识库问答 >
问题:

倒计时锁在Java中是如何工作的?[重复]

贝财
2023-03-14

我正在学习Java中的同步。我无法理解倒计时锁的确切机制。

CountDownLatch是否根据声明中给出的线程数“倒数锁存器”(等待线程数完成)?

这是我试图理解的代码:

public class LatchExample implements Runnable {
    private CountDownLatch latch;

    private int id;

    public LatchExample(int id, CountDownLatch latch){
        this.id=id;
        this.latch = latch;
    }

    public static void main(String[] args) {

        CountDownLatch latch = new CountDownLatch(5);

        ExecutorService executor = Executors.newFixedThreadPool(3);

        for (int i = 0; i < 7; i++) {
            executor.submit(new LatchExample(i,latch));
        }

        try {
            latch.await();
            System.out.println("all process completed");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        System.out.println();
    }

    @Override
    public void run() {

        System.out.println("Starting: "+id);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        latch.countDown();
    }
}

在上面的例子中:

ExecutorService(从线程池)生成7个线程。我的理解是闩锁应该等待6个线程(从0到5)的完成,定义如下:

CountDownLatch latch = new CountDownLatch(5);

但我得到的输出并不是每次都是恒定的。有时会等待6个线程完成,有时会等待7个线程完成,例如:

Starting: 1
Starting: 0
Starting: 2
Starting: 3
Starting: 5
Starting: 4
Starting: 6
all process completed

以下是交替时间的输出:

Starting: 0
Starting: 2
Starting: 1
Starting: 4
Starting: 5
Starting: 3
all process completed

Starting: 6

编辑:倒计时闩锁应该理想地倒计时,直到5个任务通过闩锁。这里显示为6或7。

如果我希望代码在“所有流程完成”之前始终只显示5个任务,那么代码的修复方法是什么?

共有3个答案

黄修永
2023-03-14

尽管我的回答为时已晚,但希望这对像我这样不熟悉线程的人有所帮助。根据我的分析,倒计时闩锁按预期工作。请执行此更改并查看输出

 @Override
 public void run() {

    //System.out.println("Starting: "+id);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    latch.countDown();
    System.out.println("Finished the thread: "+id);
}
危飞跃
2023-03-14

我认为理解CountDownLatch背后机制的最好方法是打个比方,所以我的2美分是这样的:想象一个迪斯科派对,你是DJ,在你数到舞池中有5个人之前,你不会放你最喜欢的歌曲“所有过程完成”。每次有人进来,你都倒数(从5开始),当你数到0时——你放上你最喜欢的歌。你不在乎他们是否都在舞池里,你只在乎你数到舞池里有5个人。

现在,对于您的示例,您将CountDownLatch=5并且您的for循环具有

你问:

CountDownLatch是否根据声明中给出的线程数“倒数锁存器”(等待线程数完成)?

不,它不等待线程完成,它根本不关心线程,它只关心你的计数。

在现实世界中,当您希望确保所有线程都执行了特定任务,并且现在可以继续使用main(或其他线程)时,将使用此机制。

朱越
2023-03-14

你的闩锁将需要五次倒计时()调用才能达到零,并让等待返回。但是,按照为执行器编写任务的方式,开始运行的任务将多于释放闩锁所需的任务。查看代码使用情况最有用的方法是一步一步地运行,如下所示:

  1. 任务0-2开始在三个线程池线程上运行

现在,我不太清楚您期望您的代码会做什么,但我希望上述推理方式将帮助您将其带到其行为与您的期望一致的状态。

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

  • 问题内容: 我需要直接等于的东西,但可以重置(保持线程安全!)。我不能使用经典的同步构造,因为它们在这种情况下根本无法工作(复杂的锁定问题)。目前,我正在创建许多对象,每个对象都替代了上一个对象。我相信这是在GC的年轻一代中实现的(由于对象数量众多)。您可以在下面看到使用闩锁的代码(这是ns-3网络模拟器接口模拟的一部分)。 有些想法可能是尝试(JDK5 +)或(JDK7) 我可以测试代码,然后回

  • 我有两个XML EditTexts。在一个EditText中,用户可以将一个数字作为分钟,在另一个EditText中,可以将一个数字作为秒。单击finish按钮后,seconds EditText应开始倒计时,并每秒更新其文本。 此外,我如何保持更新,直到它达到零分钟零秒?

  • 问题内容: 我想知道是否有人可以帮助我。经过数小时的不懈搜索,在这里和网上我似乎找不到使用jquery的简单倒计时。我不想使用任何类型的插件,而只是简单的jquery代码来从日期倒数。我设法在下面找到此代码。但是即使将此代码放置在我的网站中,也不会显示任何内容。我从jquery.com添加了jquery文件,并添加了ID不包含任何内容的正确div 。如果有人可以解释或告诉我如何在采用日期格式并返回

  • 怎么停止这个计时器,知道吗? 我想重置计时器在每个查询,但它继续。每个新的查询都会添加新的计时器。这个怎么解决?

  • 我经常把文本输出到文件中。我想知道:是如何工作的? 当我调用时,它是否在文件上写入文本?如果它不写文本,我需要使用flush函数来写数据吗? 例如: 如果while循环中发生错误,文件将在不写入数据的情况下关闭。如果我在while循环中使用函数,那么为什么要使用?如果我错了,请纠正我。