(後世のために、私はこの他の質問に精通だ、と私は見てるケースを示唆するように見えるだろうその答えは不可能です:あるたCountDownLatchは、スプリアスウェイクアップの影響を受けて?)
私が持っているCountDownLatch
で作成されたint
の引数1
。故意に、countDown()
このラッチに呼び出されることはありません。
私が持っているShutdownHook
こと、割り込みスレッドその呼び出しをmyLatch.await()
、と私はcatchブロックを持って、その後を扱っていますInterruptedException
。
私は私のシャットダウンフックが呼び出されると、ラッチは通常「目覚める」ことを観察しています。すなわち、await()
メソッド戻り、スレッドは中断されない、その中断状態が(によって報告されるisInterrupted()
)ですfalse
。
以下からの私の理解CountDownLatch
ドキュメントはこのシナリオが不可能であるということです。私は何をしないのですか?
このようなラッチが待望されているコードになります。
try {
myLatch.await();
System.out.println("*** done via unblock");
} catch (final InterruptedException interruptedException) {
Thread.currentThread().interrupt();
System.out.println("*** done via interrupt");
}
私が見*** done via unblock
たとき、私CTRL-C自分のアプリケーション。ドキュメントの私の読み取りがあるため、これは不可能であるということであるCountDownLatch
インスタンスはスプリアスウェイクアップの対象にはなりません。
シャットダウンフックのコードは次のようになります。
// t is the thread that is doing the await() call above
final Thread t = Thread.currentThread();
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
t.interrupt();
try {
t.join();
} catch (final InterruptedException interruptedException) {
Thread.currentThread().interrupt();
}
}));
ありがたいことに私は何かが実際に問題になっているラッチをカウントダウンしているいくつかのクラス離れたコードパスを発見しました。()私のコードが動作するようになりましたし、(b)のドキュメントが正しく、私たちが話しているときスプリアスウェイクアップが™事実はありませんAシングにあるので、よかったですCountDownLatch#await()
。