如何在Java中终止死锁线程?

8
我希望能够杀死处于死锁状态的线程。首先,我们可以使用java.lang.managementThreadMXBean类的findDeadlockedThreads()方法检测处于死锁状态的线程id
然后,我想通过线程id来杀死线程,因此有两个相关问题:
(1) 如何通过线程id获取线程控制权?
(2) 如何杀死被阻塞的线程? 我认为调用interrupt()方法会给线程一个异常并将其杀死。

4
你需要修复代码,以避免线程在第一时间就发生死锁。这应该是你努力实现的目标。 - Chris
就像Chris所说的,我认为你应该制定一个计划,以避免一开始就出现死锁。 - Alfred
1
你想要做的唯一相对安全的方法是使用System.exit()...我只是部分开玩笑。 - PSpeed
是的,如果我正在编写一个并发程序,检测和修复死锁是第一选择。但是,我计划通过在运行时检查用户线程来编写死锁检测器。 :) - Sangmin
3个回答

6

java.util.concurrent.Lock.lockInterruptibly() 方法是支持中断的,而 synchronized 锁定则更为常见但不支持中断。正如文档所述,能够枚举死锁线程的能力旨在作为调试辅助工具,而不是在生产环境中恢复的手段。

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


3

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

话虽如此,由于可能会导致对象处于不一致状态,这是非常危险的。我认为中断方法不会导致在等待同步锁时被卡住的线程被释放,因此(邪恶的)stop方法也不会。

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


3
这个问题的恶劣程度无法强调得足够。最好一开始就编写代码以避免死锁。 - bmargulies
枚举所有正在运行的线程是一篇有趣的文章,我肯定会稍后使用它。谢谢。 - Sangmin
2
Thread.stop() 方法在 Java 1.5 中似乎无法正常工作。死锁线程仍然处于 BLOCKED 状态。对我来说,我正在尝试为死锁检测器编写单元测试,但是我无法摆脱故意死锁的线程! :-) - Chris Dolan

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接