(对于后代,我熟悉另一个问题,它的答案似乎暗示我正在观察的情况是不可能的:Is CountDownLatch affected by spurious wakeups?)
我有一个 CountDownLatch
,它是使用 1
的 int
参数创建的。有意地,countDown()
永远不会在此锁存器上调用。
我有一个 ShutdownHook
可以中断调用 myLatch.await()
的线程,我有一个 catch block 可以处理后续的 InterruptedException
.
我观察到当我的关闭 Hook 被调用时,闩锁会正常“唤醒”。即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");
}
当我按 CTRL-C 我的应用程序时,我看到 *** done via unblock
。我阅读文档后发现这是不可能的,因为 CountDownLatch
实例不受虚假唤醒的影响。
关机 Hook 代码如下所示:
// 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()
时,虚假唤醒实际上不是一个东西™ .
关于java - 一个没有倒数到零的CountDownLatch如何不被中断返回呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58176200/