(Для потомков я знаком с этим другим вопросом, и его ответ, который, по-видимому, наводит на мысль о случае, за которым я наблюдаю, невозможен: Повлияет ли 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();
}
}));