Имеет ли JVM возможность уничтожать потоки из-за ограниченности ресурсов? - PullRequest
0 голосов
/ 27 января 2020

Я создал темы на основе приоритетов, например:

Приоритет потока

  • T1 P1
  • T2 P1
  • T3 P2
  • T4 P2

Я использую java.util.concurrent.CountDownLatch, чтобы все потоки с одинаковым приоритетом выполнялись одновременно вначале, а затем аналогичным образом продолжаем работу с потоками следующего приоритета. Иногда мое приложение зависает, видя дамп потока, я наблюдаю, что все потоки находятся в состоянии Runnable или Parking. Я обработал все угловые случаи, чтобы сделать обратный отсчет защелки, чтобы выполнялись потоки следующего приоритета.

Возможно ли, что JVM убивает поток с P1 между выполнением, чтобы не происходил обратный отсчет защелки, и потоки с приоритетом P2 никогда не выполняются?

Ответы [ 2 ]

2 голосов
/ 27 января 2020

Killing Thread извне устарел долго go, потому что нет чистого способа очистить все ресурсы потока извне. Таким образом, вы рискуете не очищенными ресурсами, что приводит к утечкам памяти и другим неприятным побочным эффектам. Принятый способ - послать сигнал в Tread на d ie, а затем сам поток должен очиститься и завершиться. См. здесь методы interrupt(), interrupted() и isInterrupted() класса Thread. Это означает, что ваша собственная реализация Thread должна проверить, получило ли оно прерывание, и, если это так, завершить себя со всей необходимой очисткой.

0 голосов
/ 27 января 2020

Возможно ли, что JVM убивает поток с P1 между выполнением, поэтому обратный отсчет защелки не происходит, поэтому приоритетные потоки P2 никогда не выполняются?

Нет.

JVM самопроизвольно не уничтожает потоки в ответ на загрузку или по любой другой причине. (Даже когда JVM завершает работу. В этом сценарии все существующие потоки go удаляются, когда JVM наконец завершается или уничтожается.)

Если потоки, которые вы ожидаете там, исчезли, существует Вот несколько возможных объяснений.

  • Они могли просто закончиться обычным способом; т. е. возвращается из их run() метода.

  • Возможно, они сделали что-то, что вызвало исключение. Если исключению разрешено распространение из вызова run(), поток будет прерван. Вы можете настроить обработчик необработанных исключений, чтобы справиться с этим; подробности смотрите в Thread javadocs.

  • В некоторых случаях вызов Thread.interrupt() из одного потока может вызвать исключение в другом потоке.

  • Теоретически возможно, что что-то вызвало устаревший Thread.stop() метод. (Если ваш код делает это, он не должен. Исправить это!)

...