Как уничтожить заблокированные потоки в Java?
-
13-09-2019 - |
Вопрос
Я бы хотел уничтожить потоки, которые застряли в состоянии взаимоблокировки.Во-первых, мы можем обнаружение идентификаторов потоков в состоянии взаимоблокировки используя findDeadlockedThreads()
метод проведения ThreadMXBean
класс в java.lang.management
.
Затем я хотел бы уничтожить потоки по идентификаторам потоков, и, таким образом, у меня есть два связанных вопроса:
(1) Как получить контроль над потоком по идентификатору потока?
(2) Как уничтожить заблокированный поток?Я думаю, что вызов метода interrupt() выдаст исключение для потока и остановит поток.
Решение
Из корневой threadgroup вы можете получить класс Thread перечислите все запущенные потоки.Затем вы можете вызвать Thread.stop на том, который соответствует вашему идентификатору.
Сказав это, это очень опасно из-за потенциальной возможности оставить объекты в несогласованном состоянии.Я не верю, что метод прерывания приведет к освобождению потока, который застрял в ожидании блокировки синхронизации, поэтому (злые) методы остановки
Смотрите также:"Устаревание примитива Java Thread Primitive".
Другие советы
Метод java.util.concurrent.Lock.lockInterruptibly() является прерываемым, гораздо более распространенная синхронизированная блокировка - нет.Как упоминалось в документации, возможность перечислять заблокированные потоки предназначена для облегчения отладки, а не для восстановления в производственной среде.
В производственной среде, вероятно, безопаснее завершить весь процесс и перезапустить.
Даже Thread.stop() не может остановить поток, заблокированный по встроенной блокировке.Если поток заблокирован в ожидании встроенной блокировки, вы ничего не можете сделать, чтобы остановить его, кроме как убедиться, что он в конечном итоге получит блокировку и добьется достаточного прогресса, чтобы вы могли привлечь его внимание каким-либо другим способом. Это работает с Lock.lock() до конца.