如何在Java中杀死死锁线程?

我想杀死陷入死锁状态的线程。 首先,我们可以使用java.lang.management ThreadMXBean类的findDeadlockedThreads()方法检测处于死锁状态的线程ID 。

然后,我想通过线程ID杀死线程,因此我有两个相关的问题:
(1)如何通过线程id控制线程?
(2)如何杀死被阻塞的线程? 我认为invokting interrupt()方法会给线程一个exception并将杀死线程。

从根线程组,您可以让Thread类枚举所有正在运行的线程 。 然后,您可以在与您的ID匹配的那个上调用Thread.stop。

话虽如此,由于可能使对象处于不一致状态,这非常危险。 我不相信中断方法会导致线程被释放而等待同步锁定,所以(邪恶)停止方法

另请参阅:“ Java线程原语弃用 ”。

java.util.concurrent.Lock.lockInterruptibly()方法是可中断的,更常见的同步锁定不是。 如文档中所述,枚举死锁线程的能力旨在作为调试辅助工具,而不是在生产环境中进行恢复的方法。

在生产中,退出整个过程并重新启动可能更安全。

甚至Thread.stop()也无法阻止线程在内部锁定上死锁。 如果一个线程被阻塞等待内部锁定,那么你无法做任何事情来阻止它最终获得锁定并取得足够的进展以便你能够以其他方式引起注意。 它适用于Lock.lock()。