2009-12-04 2 views
8

Я бы хотел убить потоки, застрявшие в тупике. Во-первых, мы можем использовать detect thread ids in deadlock state с использованием метода findDeadlockedThreads() класса ThreadMXBean в java.lang.management.Как убить тупиковые потоки в Java?

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

+3

Фиксация кода, чтобы потоки не зашли в тупик, в первую очередь должны быть тем, что вы пытаетесь сделать. – Chris

+0

Как и Крис, я думаю, что вы должны разработать план, чтобы избежать взаимоблокировок в первую очередь. – Alfred

+1

Единственный разумно безопасный способ сделать то, что вы хотите, это System.exit() ... и я лишь частично шучу. – PSpeed

ответ

3

Из корневой группы нитей вы можете иметь класс Thread enumerate all running threads. Затем вы можете вызвать Thread.stop на тот, который соответствует вашему идентификатору.

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

См. Также: «Java Thread Primitive Deprecation».

+3

Жестокость этого не может быть подчеркнута достаточно. Лучше написать код, чтобы избежать тупика в первую очередь. – bmargulies

+0

Перечисление всех запущенных потоков - интересная статья, поэтому я определенно буду использовать ее позже. Благодарю. – Sangmin

+1

Подход Thread.stop(), похоже, не работает в Java 1.5. Заблокированные потоки остаются в состоянии BLOCKED. Для меня я пытаюсь написать единичный тест для детектора блокировки, и я не могу избавиться от своих намеренно заторможенных потоков! :-) –

6

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

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

+1

+1 за последнее предложение –

Смежные вопросы