8

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

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

4

3 回答 3

6

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

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

于 2009-12-04T22:27:49.480 回答
3

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

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

另请参阅:“ Java Thread Primitive Deprecation ”。

于 2009-12-04T22:17:01.073 回答
3

甚至 Thread.stop() 也无法停止内在锁上死锁的线程。如果一个线程被阻塞等待一个内在锁,除了确保它最终获得锁并取得足够的进展以通过其他方式引起它的注意之外,您无法阻止它。它通过 Lock.lock() 工作。

于 2011-09-10T07:24:11.790 回答