どのように中断されることなく、ゼロ復帰までカウントダウンされていないたCountDownLatchはできますか?

レアードネルソン:

(後世のために、私はこの他の質問に精通だ、と私は見てるケースを示唆するように見えるだろうその答えは不可能です:あるた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()

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=332975&siteId=1