倒计时闩锁在Java中是如何工作的?
我正在学习Java中的同步。我无法理解倒计时闩锁的确切机制 CountDownLatch是否根据声明中给出的线程数对闩锁进行“倒计时”(等待线程数的完成) 以下是我试图理解的代码:倒计时闩锁在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){
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可见之前,将主线程块放在闩锁上。有很多可能性。您的闩锁将需要五次
倒计时()
调用才能达到零,并让等待
返回。但是,按照为执行器编写任务的方式,开始运行的任务将多于释放闩锁所需的任务。查看代码使用情况最有用的方法是逐步运行,如下所示:
开始:n
打印三次,其中n
范围在0和2之间,但顺序任意李>
开始:n
打印三次,n
范围在3到5之间,顺序任意李>
所有已完成的过程
几乎与开始:6
同时打印,顺序任意现在,我不太清楚您期望代码会做什么,但我希望上述推理方式将帮助您使其行为符合您的期望。您的闩锁需要五次
倒计时()
调用才能达到零,并让等待
返回。但是,按照为执行器编写任务的方式,开始运行的任务将多于释放闩锁所需的任务。查看代码使用情况最有用的方法是逐步运行,如下所示:
开始:n
打印三次,其中n
范围在0和2之间,但顺序任意李>
开始:n
打印三次,n
范围在3到5之间,顺序任意李>
所有已完成的过程
几乎与开始:6
同时打印,顺序任意现在,我不太清楚您期望您的代码会做什么,但我希望上述推理方式将帮助您使其行为符合您的期望。我认为理解倒计时闩锁背后机制的最佳方法是进行类比,所以我的2美分是这样的:想象一个迪斯科派对,你就是DJ,你不会把你最喜欢的歌曲命名为“所有过程完成”,直到你在舞池里数了5个人。每次有人进来,你都会倒数(从5开始),当你数到0时,你就会放上你最喜欢的歌。你不在乎他们是否都在舞池里,你只在乎舞池里有5个人
现在,以你的例子来说,你把countDownLatch=5,你的for循环有我认为理解countDownLatch背后机制的最好方法是进行类比,所以我的