有没有办法获取死锁线程的引用,然后令它马上停止呢?

来源:14-10 ThreadMXBean工具介绍

Small_6

2019-12-28

//  The management interface for the thread system of the JVM
//  JVM has a single instance of the implementation class of this interface. 
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
// array of IDs of the threads that are deadlocked waiting for object monitors or ownable synchronizers
// TODO 有没有办法获取死锁线程的引用?这样就可以直接interrupt()发起中断期望^_^,我看了一下API貌似没有这种方法。
// 当然,这样我们的代码就像“超级管理员”一样了。(这样有可能把两个死锁线程都杀死,而不是杀掉一个线程。)
long[] deadlockedThreads = threadMXBean.findDeadlockedThreads();
if (deadlockedThreads != null && deadlockedThreads.length > 0) {
    for (int i = 0; i < deadlockedThreads.length; i++) {
        ThreadInfo threadInfo = threadMXBean.getThreadInfo(deadlockedThreads[i]);
        String threadName = threadInfo.getThreadName();
        System.out.println("发现死锁,线程的名字是:" + threadName);
    }
}


写回答

1回答

悟空

2019-12-28

可以的,

在ThreadInfo中,拥有线程ID,因此可以使用它来获取对线程的引用。

ThreadInfo[] threadInfos = ....;
Set<Long> tIds = new HashSet<>();
for (ThreadInfo tIndo : threadInfos) {
 tIds.add(tIndo.getId());
}
for (Thread t : Thread.getAllStackTraces().keySet()) {
 if(tIds.contains(t.getId()) {
   t.interrupt();
 }
}


参考:https://www.thinbug.com/q/33233325

1
4
悟空
回复
Small_6
想中断的话,这里面有具体讲解可中断锁这种类型哈,新课程已经上线啦: 《玩转Java并发工具,精通JUC,成为并发多面手》: 线程池+各种锁+CAS+AQS+ThreadLocal+ConcurrentHashMap+并发综合实战项目 https://coding.imooc.com/class/409.html
2019-12-28
共4条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程