【发布时间】:2015-02-04 05:16:33
【问题描述】:
我正在学习 Java 中的同步。我无法理解 CountDownLatch 的确切机制。
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();
}
}
在上面的例子中:
7 个线程由 ExecutorService(来自线程池)产生。我的理解是,latch 应该等待 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
编辑:理想情况下,CountDownLatch 应该 countDown 直到 5 个任务通过锁存器。这里显示为 6 或 7。
如果我希望它在 'all process completed' 之前始终只显示 5 个任务,那么代码的修复方法是什么?
【问题讨论】:
-
你为什么给
CountDownLatch5而不是7?在 CountDownLatch 的 java 文档中的示例中,查看N -
@Jack 如果我只想等待 5 或 6 个线程的完成?这就是为什么。
-
好吧,那么它工作正常。这只是一种竞争条件,因为一次可以运行多个线程...
Executors.newFixedThreadPool(3); -
您的执行程序池不会产生 7 个线程,而是产生 3 个线程和 7 个任务。而在“完成”之前打印“开始”这一事实并不意味着它实际上正在等待它。
-
@Jack 它工作不正常。理想情况下,它应该只为 5 个任务倒计时。它适用于 6 个或 7 个任务。
标签: java multithreading countdownlatch