zapl 是绝对正确的!主线程正在等待超时结束。如果您在主线程等待闩锁期间进行线程转储,您将看到如下内容:
"main" #1 prio=5 os_prio=31 tid=0x00007fa4be002000 nid=0x1303 waiting on condition [0x000000010b74c000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000076abcb598> (a java.util.concurrent.CountDownLatch$Sync)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1037)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1328)
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:277)
来自的Javadoc await
:
如果当前计数大于零,则当前线程出于线程调度目的而被禁用并处于休眠状态,直到发生以下三种情况之一:
- 由于调用了 countDown 方法,计数达到零;或者
- 其他一些线程中断当前线程;或者
- 指定的等待时间已过。
在您的情况下,await
调用仅因为 3) 而返回。
在CountDownLatch
Javadoc 中,对countDown()
方法的调用应该在finally
块中完成:
public void run() {
try {
startSignal.await();
doWork(); // may throw exception
} catch (InterruptedException ex) {
// handle interruption ...
} finally {
doneSignal.countDown(); // cause await to return asap
}
}