一个没有倒数到零return的CountDownLatch怎么能不被中断呢?

How can a CountDownLatch that is not counted down to zero return without being interrupted?

(对于后代,我熟悉这个其他问题,它的答案似乎暗示我正在观察的情况是不可能的:

我有一个 CountDownLatch,它是使用 1int 参数创建的。故意地,countDown() 永远不会在此锁存器上调用。

我有一个 ShutdownHook 中断调用 myLatch.await() 的线程,我有一个 catch 块处理后续的 InterruptedException.

我观察到当我的关闭挂钩被调用时,闩锁 "wakes up" 正常。即await()方法returns,线程未被中断,其中断状态(如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");
}

当我 CTRL-C 我的应用程序时,我看到 *** done via unblock。我对文档的阅读是,这是不可能的,因为 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();
      }
 }));

谢天谢地,我找到了一个代码路径,其中有几个 类 确实在对有问题的锁存器进行倒计时。谢天谢地,因为 (a) 我的代码现在可以工作,并且 (b) 文档是正确的,当我们谈论 CountDownLatch#await().

时,虚假唤醒实际上不是什么东西™