转载自 干货 | 教你如何监控 Java 线程池运行状态

之前写过一篇 Java 线程池的使用介绍文章《线程池全面解析》,全面介绍了什么是线程池、线程池核心类、线程池工作流程、线程池分类、拒绝策略、及如何提交与关闭线程池等。

但在实际开发过程中,在线程池使用过程中可能会遇到各方面的故障,如线程池阻塞,无法提交新任务等。

如果你想监控某一个线程池的执行状态,线程池执行类 ThreadPoolExecutor 也给出了相关的 API, 能实时获取线程池的当前活动线程数、正在排队中的线程数、已经执行完成的线程数、总线程数等。

总线程数 = 排队线程数 + 活动线程数 + 执行完成的线程数。

下面给出一个线程池使用示例,及教你获取线程池状态。

private static ExecutorService es = new ThreadPoolExecutor(50, 100, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(100000));public static void main(String[] args) throws Exception {for (int i = 0; i < 100000; i++) {es.execute(() -> {System.out.print(1);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}});}ThreadPoolExecutor tpe = ((ThreadPoolExecutor) es);while (true) {System.out.println();int queueSize = tpe.getQueue().size();System.out.println("当前排队线程数:" + queueSize);int activeCount = tpe.getActiveCount();System.out.println("当前活动线程数:" + activeCount);long completedTaskCount = tpe.getCompletedTaskCount();System.out.println("执行完成线程数:" + completedTaskCount);long taskCount = tpe.getTaskCount();System.out.println("总线程数:" + taskCount);Thread.sleep(3000);}}

线程池提交了 100000 个任务,但同时只有 50 个线程在执行工作,我们每陋 3 秒来获取当前线程池的运行状态。

第一次程序输出:

当前排队线程数:
99950当前活动线程数:
50执行完成线程数:
0总线程数(排队线程数 + 活动线程数 +  执行完成线程数):
100000

第二次程序输出:

当前排队线程数:
99800当前活动线程数:
50执行完成线程数:
150总线程数(排队线程数 + 活动线程数 +  执行完成线程数):
100000

活动线程数和总线程数是不变的,排队中的线程数和执行完成的线程数不断在变化,直到所有任务执行完毕,最后输出:

当前排队线程数:
0当前活动线程数:
0执行完成线程数:
100000总线程数(排队线程数 + 活动线程数 +  执行完成线程数):
100000

这样,你了解了这些 API 的使用方法,你想监控线程池的状态就非常方便了。

教你如何监控 Java 线程池运行状态相关推荐

  1. java 线程状态监控_干货:教你如何监控 Java 线程池运行状态

    之前写过一篇 Java 线程池的使用介绍文章<线程池全面解析>,全面介绍了什么是线程池.线程池核心类.线程池工作流程.线程池分类.拒绝策略.及如何提交与关闭线程池等. 但在实际开发过程中, ...

  2. zabbix监控java线程池,linux线程数限制与zabbix监控

    Linux最大线程数限制及当前线程数查询 最大线程数计算方式: n = total_memory/128k; Linux用户线程数限制而导致的程序异常为 java.lang.OutOfMemoryEr ...

  3. 【Java】Java 线程池 8 大拒绝策略

    1.概述 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的这个api,大大的简化了多线程代码的开发.而不论你用F ...

  4. 深入理解Java线程池:ThreadPoolExecutor

    线程池介绍 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理.如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题: 如果并发的请求数量非常多,但每个线 ...

  5. Java线程池实现原理及其在美团业务中的实践

    来自:美团技术团队 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池ThreadPoolExecuto ...

  6. 深入理解 Java 线程池:ThreadPoolExecutor

    线程池介绍 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理.如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题: 如果并发的请求数量非常多,但每个线 ...

  7. Java 线程池(ThreadPoolExecutor)原理分析与使用

    ThreadPoolExecutor原理概述 在我们的开发中"池"的概念并不罕见,有数据库连接池.线程池.对象池.常量池等等.下面我们主要针对线程池来一步一步揭开线程池的面纱. 使 ...

  8. Java线程池Executor框架

    一.为什么要引入线程池 当存在大量并发任务时,创建.销毁线程需要很大的开销,运用线程池可以大大减小开销. 二.Executor框架 说明: Executor 执行器接口,该接口定义执行Runnable ...

  9. 面试官问:你做过什么Java线程池实践,我写了一篇博客给他看~

    线程池大家都## 标题很熟悉,无论是平时的业务开发还是框架中间件都会用到,大部分都是基于JDK线程池ThreadPoolExecutor做的封装, 都会牵涉到这几个核心参数的设置:核心线程数,等待(任 ...

最新文章

  1. php 获取时间段 今天昨天本周上周本月上月本季度本年去年
  2. Python中yield
  3. 前端学习(1925)vue之电商管理系统电商系统之美化一层循环的UI结构
  4. leetcode37 --- solveSudoku(解数独)
  5. Jmter安装和配置
  6. jquery ajax实例 php,jquery中各个ajax实例操作
  7. 3D应用开发中的欧拉角和旋转矩阵
  8. 帆软之使用FineTube将其他来源数据同步至简道云表单(多图预警)
  9. java messagedigest_Java自带的加密类MessageDigest类代码示例
  10. solidworks 之迈迪同步轮尺寸与设计不复的解决
  11. win10如何强制性关闭驱动数字签名
  12. matlab 电路频率响应_电力电子模型频率响应估计
  13. 迄今见过的最好的职业规划文章
  14. 在JDK1.8中,ArrayList扩容机制Increments modCount与起始化讲解
  15. 杨氏不等式(控制中的应用)
  16. puzzle(0112)不规则数独、变种数独
  17. 纳尼,五子棋AI居然这么简单?
  18. Android Android Studio 集成豌豆荚App墙广告
  19. css 虚线步宽的写法
  20. Oracle关工单差异分析,Oracle EBS 工单关闭问与答

热门文章

  1. php 百度云 上传,求个PHP版百度云BOS上传文件的dome
  2. 图的建立-邻接表表示(C语言)
  3. 《C++ Primer》7.3.1节练习
  4. random(随机函数生成)
  5. SpringBoot中Bean按条件装配
  6. cg word List4
  7. Java序列化、反序列化
  8. HDU 4812 D Tree (点分治) (2013ACM/ICPC亚洲区南京站现场赛)
  9. P4847 银河英雄传说V2 非旋treap
  10. 【杭电多校2020】Distinct Sub-palindromes【结论】【构造】