Как CountDownLatch, который не отсчитывается до нуля, может вернуться без прерывания? - PullRequest
2 голосов
/ 01 октября 2019

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

1 Ответ

1 голос
/ 02 октября 2019

К счастью, я нашел кодовую дорожку, где в нескольких классах что-то действительно ведет обратный отсчет. Слава Богу, поскольку (а) мой код теперь работает и (б) документация верна, а ложные пробуждения на самом деле не вещь, когда мы говорим о CountDownLatch#await().

...