如何杀死在Java中死锁线程?
-
13-09-2019 - |
题
我想杀死那些停留在僵局状态的线程。首先,我们可以检测死锁状态的线程ID 使用findDeadlockedThreads()
的ThreadMXBean
类的java.lang.management
方法。
然后,我想通过杀死线程ID线程,因此我有两个相关的问题:点击 (1)如何获得通过线程ID线程的控制?点击 (2)如何杀死一个阻塞的线程?我认为invokting中断()方法将得到的例外线程和将杀死线程。
解决方案
从根线程组,你可以有Thread类枚举所有正在运行的线程。然后,你可以调用使用Thread.stop对你的ID相匹配的。
话虽如此,这是非常危险的,由于离开处于不一致的状态的对象的可能性。我不相信该中断方法将导致一个线程被释放滞留在等待一个同步锁,所以(恶)停止方法
另请参见:“ Java线程原始弃用”。
其他提示
在java.util.concurrent.Lock.lockInterruptibly()方法是可中断的,则更为常见同步锁定不是。如文档中所提及的,枚举死锁线程的能力的目的是作为调试辅助而不是在生产环境中恢复的装置。
在生产它可能是更安全的退出整个过程并重新启动。
即使使用Thread.stop()是无法停止线程死锁在内部锁。如果一个线程被阻塞,等待内部锁,没有什么可以阻止它这样做短确保它最终获得锁,使足够的进展,你可以得到它的关注一些其他的方式。的它与锁.lock()通过。
不隶属于 StackOverflow