线程池监控 - 简易版

简介: `Java`线程池想必大家都不会陌生,对于一些可以并发可以执行的任务,我们优先选择考虑线程池进行操作,但是对于其中一些指标出问题,我们很难去排查,这里就带大家撸一个简易版本的线程池监控。
   Java线程池想必大家都不会陌生,对于一些可以并发可以执行的任务,我们优先选择考虑线程池进行操作,但是对于其中一些指标出问题,我们很难去排查,这里就带大家撸一个简易版本的线程池监控。

ThreadPoolExecutor

  在原生的线程池中,许多我们想监控的变量都是 private的(满满的恶意),但是有些是提供了 get方法帮助我们去获取(除了运行状态字段)。

  我们要想完成达到监控的效果,就要对此进行扩展,不满足于只有get方法的字段监控。这个时候就需要介绍下原生线程池中的两个方法:

  1. beforeExecute(Thread t, Runnable r)

    该方法是执行任务之前执行。
  2. afterExecute(Runnable r, Throwable t)

    该方法是执行任务之后执行(必执行,放置在finally语句中)。

我们可以在这两个方法中增加额外操作,帮助我们可以监控其他指标。

MBean

   MBean就是一种规范的JavaBean,通过集成和实现一套标准的Bean接口,这种叫MBean,Mbean注册到MBeanServer中。(可以理解为一种 JVM允许状态辅助查询的 Bean)。

  在本Demo中,我是通过MBean的形式去进行指标的监控,所以也帮大家去了解下它。

  在此,我使用的HtmlAdaptorServer去展示对应的MBean信息。

关键代码

  1. beforeExecute
 protected void beforeExecute(Thread t, Runnable r) {
         // 记录每次执行的开始时间
        startTime.set(System.currentTimeMillis());
    }
  1. afterExecute
 protected void afterExecute(Runnable r, Throwable t) {
        long costTime = System.currentTimeMillis() - startTime.get(); // 计算任务花费时间
        startTime.remove(); // 清空开始时间
        maxCostTime = Math.max(maxCostTime, costTime);
        if (totalTasks.get() == 0) {
            minCostTime = costTime;
        }
        minCostTime = Math.min(minCostTime, costTime);
        totalCostTime.addAndGet(costTime);
        totalTasks.incrementAndGet();
        activeCount = this.getActiveCount();
}
  1. registerMBean
    public static void registerMBean(Object obj, ObjectName objectName) {
        try {
            // 注册MBean信息
            server.registerMBean(obj, objectName);
        } catch (InstanceAlreadyExistsException | MBeanRegistrationException | NotCompliantMBeanException e) {
            e.printStackTrace();
        }
    }

效果图

1.jpg

项目地址:montos-threadPool-monitoring
欢迎小伙伴们star以及fork等。

目录
相关文章
|
监控 Java
Idea+Jconsole实现线程监控
Idea+Jconsole实现线程监控
542 0
|
20天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
97 38
|
20天前
|
Prometheus 监控 Cloud Native
JAVA线程池监控以及动态调整线程池
【10月更文挑战第22天】在 Java 中,线程池的监控和动态调整是非常重要的,它可以帮助我们更好地管理系统资源,提高应用的性能和稳定性。
55 4
|
20天前
|
Prometheus 监控 Cloud Native
在 Java 中,如何使用线程池监控以及动态调整线程池?
【10月更文挑战第22天】线程池的监控和动态调整是一项重要的任务,需要我们结合具体的应用场景和需求,选择合适的方法和策略,以确保线程池始终处于最优状态,提高系统的性能和稳定性。
88 2
|
22天前
|
监控 数据可视化 Java
如何使用JDK自带的监控工具JConsole来监控线程池的内存使用情况?
如何使用JDK自带的监控工具JConsole来监控线程池的内存使用情况?
|
2月前
|
Arthas 监控 Java
监控线程池的内存使用情况以预防内存泄漏
监控线程池的内存使用情况以预防内存泄漏
|
2月前
|
监控 数据可视化 Java
使用JDK自带的监控工具JConsole来监控线程池的内存使用情况
使用JDK自带的监控工具JConsole来监控线程池的内存使用情况
|
监控 C# C++
VS+C#+WPF多线程视频摄像头播放器监控
VS+C#+WPF多线程视频摄像头播放器监控
317 0
VS+C#+WPF多线程视频摄像头播放器监控
|
6月前
|
监控
写一个线程来监控各线程是否发生阻塞
写一个线程来监控各线程是否发生阻塞
61 0
|
Web App开发 消息中间件 Prometheus
Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!(一)
Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!