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

                            /*此处可以释放所有锁,回退,并且等待一段随机的时间后重试*/

                        }
                    }
                }
            }
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值