Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
倒计时闩锁在Java中是如何工作的?_Java_Multithreading_Countdownlatch - Fatal编程技术网

倒计时闩锁在Java中是如何工作的?

倒计时闩锁在Java中是如何工作的?,java,multithreading,countdownlatch,Java,Multithreading,Countdownlatch,我正在学习Java中的同步。我无法理解倒计时闩锁的确切机制 CountDownLatch是否根据声明中给出的线程数对闩锁进行“倒计时”(等待线程数的完成) 以下是我试图理解的代码: public class LatchExample implements Runnable { private CountDownLatch latch; private int id; public LatchExample(int id, CountDownLatch latch){

我正在学习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();
    }
}
但我得到的输出并不是每次都是恒定的。有时等待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个任务,那么代码的修复方法是什么?

CountDownLatch用数字初始化,这个数字意味着在等待等待()的线程可以执行之前,必须调用countDown()多少次

new CountDownLatch(5) 
必须调用countDown()5次,然后才能处理等待wait()的线程。 所以把你的代码改成

new CountDownLatch(7) 

CountDownLatch是用数字初始化的,这个数字意味着在等待wait()的线程可以执行之前,必须调用countDown()多少次

new CountDownLatch(5) 
必须调用countDown()5次,然后才能处理等待wait()的线程。 所以把你的代码改成

new CountDownLatch(7) 

它独立于线程

当有人在倒计时闩锁上呼叫wait时,如果计数器不为零,他们将阻塞。它们将继续阻塞,直到计数器达到零,或者直到达到超时(如果它们调用了允许超时的wait版本)


你可以让一个线程做功,然后递减计数器,另一个线程等待这n件事情完成。您还可以拥有一个值为1的倒计时闩锁,并让另一个线程在构建gui时进行初始化。然后在使gui可见之前,将主线程块放在闩锁上。有很多可能性。

它独立于线程

当有人在倒计时闩锁上呼叫wait时,如果计数器不为零,他们将阻塞。它们将继续阻塞,直到计数器达到零,或者直到达到超时(如果它们调用了允许超时的wait版本)


你可以让一个线程做功,然后递减计数器,另一个线程等待这n件事情完成。您还可以拥有一个值为1的倒计时闩锁,并让另一个线程在构建gui时进行初始化。然后在使gui可见之前,将主线程块放在闩锁上。有很多可能性。

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

  • 任务0-2开始在三个线程池线程上运行
  • 您将看到
    开始:n
    打印三次,其中
    n
    范围在0和2之间,但顺序任意
  • 第二次通过
  • 这三个任务几乎同时完成,使闩锁的计数下降到2
  • 任务3-5开始运行
  • 您可以看到
    开始:n
    打印三次,
    n
    范围在3到5之间,顺序任意
  • 又过了一秒
  • 任务3-5几乎同时完成,释放闩锁。现在,主线程可以继续,任务6可以启动
  • 所有已完成的过程
    几乎与
    开始:6
    同时打印,顺序任意

  • 现在,我不太清楚您期望代码会做什么,但我希望上述推理方式将帮助您使其行为符合您的期望。

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

  • 任务0-2开始在三个线程池线程上运行
  • 您将看到
    开始:n
    打印三次,其中
    n
    范围在0和2之间,但顺序任意
  • 第二次通过
  • 这三个任务几乎同时完成,使闩锁的计数下降到2
  • 任务3-5开始运行
  • 您可以看到
    开始:n
    打印三次,
    n
    范围在3到5之间,顺序任意
  • 又过了一秒
  • 任务3-5几乎同时完成,释放闩锁。现在,主线程可以继续,任务6可以启动
  • 所有已完成的过程
    几乎与
    开始:6
    同时打印,顺序任意

  • 现在,我不太清楚您期望您的代码会做什么,但我希望上述推理方式将帮助您使其行为符合您的期望。

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


    现在,以你的例子来说,你把countDownLatch=5,你的for循环有我认为理解countDownLatch背后机制的最好方法是进行类比,所以我的