教你如何监控 Java 线程池运行状态
转载自 干货 | 教你如何监控 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 线程池运行状态相关推荐
- java 线程状态监控_干货:教你如何监控 Java 线程池运行状态
之前写过一篇 Java 线程池的使用介绍文章<线程池全面解析>,全面介绍了什么是线程池.线程池核心类.线程池工作流程.线程池分类.拒绝策略.及如何提交与关闭线程池等. 但在实际开发过程中, ...
- zabbix监控java线程池,linux线程数限制与zabbix监控
Linux最大线程数限制及当前线程数查询 最大线程数计算方式: n = total_memory/128k; Linux用户线程数限制而导致的程序异常为 java.lang.OutOfMemoryEr ...
- 【Java】Java 线程池 8 大拒绝策略
1.概述 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的这个api,大大的简化了多线程代码的开发.而不论你用F ...
- 深入理解Java线程池:ThreadPoolExecutor
线程池介绍 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理.如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题: 如果并发的请求数量非常多,但每个线 ...
- Java线程池实现原理及其在美团业务中的实践
来自:美团技术团队 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池ThreadPoolExecuto ...
- 深入理解 Java 线程池:ThreadPoolExecutor
线程池介绍 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理.如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题: 如果并发的请求数量非常多,但每个线 ...
- Java 线程池(ThreadPoolExecutor)原理分析与使用
ThreadPoolExecutor原理概述 在我们的开发中"池"的概念并不罕见,有数据库连接池.线程池.对象池.常量池等等.下面我们主要针对线程池来一步一步揭开线程池的面纱. 使 ...
- Java线程池Executor框架
一.为什么要引入线程池 当存在大量并发任务时,创建.销毁线程需要很大的开销,运用线程池可以大大减小开销. 二.Executor框架 说明: Executor 执行器接口,该接口定义执行Runnable ...
- 面试官问:你做过什么Java线程池实践,我写了一篇博客给他看~
线程池大家都## 标题很熟悉,无论是平时的业务开发还是框架中间件都会用到,大部分都是基于JDK线程池ThreadPoolExecutor做的封装, 都会牵涉到这几个核心参数的设置:核心线程数,等待(任 ...
最新文章
- php 获取时间段 今天昨天本周上周本月上月本季度本年去年
- Python中yield
- 前端学习(1925)vue之电商管理系统电商系统之美化一层循环的UI结构
- leetcode37 --- solveSudoku(解数独)
- Jmter安装和配置
- jquery ajax实例 php,jquery中各个ajax实例操作
- 3D应用开发中的欧拉角和旋转矩阵
- 帆软之使用FineTube将其他来源数据同步至简道云表单(多图预警)
- java messagedigest_Java自带的加密类MessageDigest类代码示例
- solidworks 之迈迪同步轮尺寸与设计不复的解决
- win10如何强制性关闭驱动数字签名
- matlab 电路频率响应_电力电子模型频率响应估计
- 迄今见过的最好的职业规划文章
- 在JDK1.8中,ArrayList扩容机制Increments modCount与起始化讲解
- 杨氏不等式(控制中的应用)
- puzzle(0112)不规则数独、变种数独
- 纳尼,五子棋AI居然这么简单?
- Android Android Studio 集成豌豆荚App墙广告
- css 虚线步宽的写法
- Oracle关工单差异分析,Oracle EBS 工单关闭问与答
热门文章
- php 百度云 上传,求个PHP版百度云BOS上传文件的dome
- 图的建立-邻接表表示(C语言)
- 《C++ Primer》7.3.1节练习
- random(随机函数生成)
- SpringBoot中Bean按条件装配
- cg word List4
- Java序列化、反序列化
- HDU 4812 D Tree (点分治) (2013ACM/ICPC亚洲区南京站现场赛)
- P4847 银河英雄传说V2 非旋treap
- 【杭电多校2020】Distinct Sub-palindromes【结论】【构造】