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
:
現在のカウントが 0 より大きい場合、現在のスレッドはスレッド スケジューリングの目的で無効になり、次の 3 つのいずれかが発生するまで休止状態になります。
- 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
}
}