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

San*_*min 8 java multithreading deadlock interrupt

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

于是,我想通过杀死线程ID线程,因此我有两个相关的问题:
(1)如何获得通过线程ID线程的控制?
(2)如何杀死被阻塞的线程?我认为调用interrupt()方法会给线程一个异常并将杀死线程.

Mar*_*ton 6

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

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


jsi*_*ght 3

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

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

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

  • 这件事的坏处怎么强调都不为过。最好首先编写代码以避免死锁。 (3认同)
  • Thread.stop() 方法似乎在 Java 1.5 中不起作用。死锁线程仍处于 BLOCKED 状态。对我来说,我正在尝试为死锁检测器编写单元测试,但我无法摆脱故意死锁的线程!:-) (2认同)