天天看點

java簡單的死鎖檢測(轉載線下代碼)

一個簡單的死鎖檢測功能、

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());
                            }

                            /*此處可以釋放所有鎖,回退,并且等待一段随機的時間後重試*/

                        }
                    }
                }
            }
        }
    }
}