一个没有倒数到零return的CountDownLatch怎么能不被中断呢?
How can a CountDownLatch that is not counted down to zero return without being interrupted?
(对于后代,我熟悉这个其他问题,它的答案似乎暗示我正在观察的情况是不可能的:)
我有一个 CountDownLatch
,它是使用 1
的 int
参数创建的。故意地,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()
.
时,虚假唤醒实际上不是什么东西™
(对于后代,我熟悉这个其他问题,它的答案似乎暗示我正在观察的情况是不可能的:
我有一个 CountDownLatch
,它是使用 1
的 int
参数创建的。故意地,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()
.