Вопрос

Я бы хотел уничтожить потоки, которые застряли в состоянии взаимоблокировки.Во-первых, мы можем обнаружение идентификаторов потоков в состоянии взаимоблокировки используя findDeadlockedThreads() метод проведения ThreadMXBean класс в java.lang.management.

Затем я хотел бы уничтожить потоки по идентификаторам потоков, и, таким образом, у меня есть два связанных вопроса:
(1) Как получить контроль над потоком по идентификатору потока?
(2) Как уничтожить заблокированный поток?Я думаю, что вызов метода interrupt() выдаст исключение для потока и остановит поток.

Это было полезно?

Решение

Из корневой threadgroup вы можете получить класс Thread перечислите все запущенные потоки.Затем вы можете вызвать Thread.stop на том, который соответствует вашему идентификатору.

Сказав это, это очень опасно из-за потенциальной возможности оставить объекты в несогласованном состоянии.Я не верю, что метод прерывания приведет к освобождению потока, который застрял в ожидании блокировки синхронизации, поэтому (злые) методы остановки

Смотрите также:"Устаревание примитива Java Thread Primitive".

Другие советы

Метод java.util.concurrent.Lock.lockInterruptibly() является прерываемым, гораздо более распространенная синхронизированная блокировка - нет.Как упоминалось в документации, возможность перечислять заблокированные потоки предназначена для облегчения отладки, а не для восстановления в производственной среде.

В производственной среде, вероятно, безопаснее завершить весь процесс и перезапустить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top