【发布时间】:2020-01-29 04:22:47
【问题描述】:
我正在创建一个简单的 Java8 并发 CountDownLatch 示例。我正在创建一个大小为 2 的锁存器并启动 2 个线程并在锁存器上调用 await。请参见下面的示例。
package CountDownLatchExample;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
static final CountDownLatch latch = new CountDownLatch(2);
public static void main(String[] args) throws InterruptedException {
MyThread thread = new MyThread(latch);
new Thread(thread).start();
new Thread(thread).start();
latch.await();
System.out.println(Thread.currentThread().getName() + " done.");
}
}
class MyThread implements Runnable {
CountDownLatch latch;
MyThread(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
latch.countDown();
System.out.println(Thread.currentThread().getName() + " completed.");
}
}
我希望 Thread-0、Thread-1 在 main 完成(基于 sysout)之前完成。但是,当我执行程序时,有时甚至会在 Thread-1 完成之前打印“主要完成”消息。是我的实现还是我的理解不正确?请提出建议。
输出:
> Task :CountDownLatchExample.main()
Thread-0 completed.
main done.
Thread-1 completed.
【问题讨论】:
-
哎呀。刚刚意识到倒计时会减少闩锁,因此它甚至在打印“线程完成”消息之前就达到了零。
标签: java multithreading concurrency