一个简单的死锁检测功能、
1.探测出死锁
主要是:java.lang.management类的关于线程的系列方法
一个线程监控类
ThreadMXBean x=ManagementFactory.getThreadMXBean();
使用x的方法
findDeadlockedThreads();
得到发生死锁线程的ID
通过ID获取线程信息ThreadInfo发送到处理类
package com.j.osdemo.deadlockcheck;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* @Author {一位讲师}
* @Version 1.0
* @Description 死锁探测器
* @Date: 2020/4/27 0027
*/
public class DeadLockDetector {
/*定义死锁线程处理类*/
private final DeadlockHandler deadlockHandler;
/*定义时间量*/
private final long period;
/*定义时间单位*/
private final TimeUnit unit;
/*开启线程监控类*/
private final ThreadMXBean mbean = ManagementFactory.getThreadMXBean();
/*定义一个线程池*/
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
final Runnable deadlockCheck = new Runnable() {
@Override
public void run() {
/*得到死锁线程的Thread ID*/
long[] deadlockedThreadIds = DeadLockDetector.this.mbean.findDeadlockedThreads();
if (deadlockedThreadIds != null) {
/*根据线程ID,得到所有的死锁线程*/
ThreadInfo[] threadInfos =
DeadLockDetector.this.mbean.getThreadInfo(deadlockedThreadIds);
/*调用死锁线程处理器中的方法,进行死锁线程的处理*/
DeadLockDetector.this.deadlockHandler.handleDeadlock(threadInfos);
}
}
};
public DeadLockDetector(final DeadlockHandler deadlockHandler,
final long period, final TimeUnit unit) {
this.deadlockHandler = deadlockHandler;
this.period = period;
this.unit = unit;
}
/**
* 线程开启检测
*/
public void start() {
this.scheduler.scheduleAtFixedRate(
this.deadlockCheck, this.period, this.period, this.unit);
}
}
2.死锁处理(一般是警报)
package com.j.osdemo.deadlockcheck;
import java.lang.management.ThreadInfo;
import java.util.Map;
/**
* @Author {一位讲师}
* @Version 1.0
* @description 死锁处理
* @Date: 2020/4/27 0027
*/
public class DeadlockConsoleHandler implements DeadlockHandler {
@Override
public void handleDeadlock(final ThreadInfo[] deadlockedThreads) {
if (deadlockedThreads != null) {
/*死锁线程 被检测到*/
System.err.println("Deadlock detected!");
Map<Thread, StackTraceElement[]> stackTraceMap = Thread.getAllStackTraces();
for (ThreadInfo threadInfo : deadlockedThreads) {
if (threadInfo != null) {
for (Thread thread : Thread.getAllStackTraces().keySet()) {
if (thread.getId() == threadInfo.getThreadId()) {
System.err.println(threadInfo.toString().trim());
for (StackTraceElement ste : thread.getStackTrace()) {
System.err.println("t" + ste.toString().trim());
}
/*此处可以释放所有锁,回退,并且等待一段随机的时间后重试*/
}
}
}
}
}
}
}