一個簡單的死鎖檢測功能、
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());
}
/*此處可以釋放所有鎖,回退,并且等待一段随機的時間後重試*/
}
}
}
}
}
}
}