java 线程状态监控_干货:教你如何监控 Java 线程池运行状态
之前写过一篇 Java 线程池的使用介绍文章《线程池全面解析》,全面介绍了什么是线程池、线程池核心类、线程池工作流程、线程池分类、拒绝策略、及如何提交与关闭线程池等。
但在实际开发过程中,在线程池使用过程中可能会遇到各方面的故障,如线程池阻塞,无法提交新任务等。
如果你想监控某一个线程池的执行状态,线程池执行类 ThreadPoolExecutor 也给出了相关的 API, 能实时获取线程池的当前活动线程数、正在排队中的线程数、已经执行完成的线程数、总线程数等。总线程数 = 排队线程数 + 活动线程数 + 执行完成的线程数。
下面给出一个线程池使用示例,及教你获取线程池状态。
private static ExecutorService es = new ThreadPoolExecutor(50, 100, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(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技术栈微信公众号,在公众号后台回复关键字:多线程,以下仅为部分预览。出场率比较高的一道多线程安全面试题
sleep( ) 和 wait( ) 的这 5 个区别
Java多线程神器:join使用及原理
面试常考:Synchronized 有几种用法?
任务并行神器:Fork & Join 框架详解
本文原创首发于微信公众号:Java技术栈(id:javastack),转载请原样保留本信息。
java 线程状态监控_干货:教你如何监控 Java 线程池运行状态相关推荐
- java 弱引用定位_手把手教你定位常见Java性能问题
概述 性能优化一向是后端服务优化的重点,但是线上性能故障问题不是经常出现,或者受限于业务产品,根本就没办法出现性能问题,包括笔者自己遇到的性能问题也不多,所以为了提前储备知识,当出现问题的时候不会手忙 ...
- 如何查找历史线程阻塞原因_吊打面试官!Java多线程并发 108 道题,你能答对多少?...
多线程并发108题 1.Java中实现多线程有几种方法 2.继承Thread 类 3.实现Runnable 接口. 4.ExecutorService. Callable. Future 有返回值线程 ...
- java 文本工具类_干货:排名前16的Java工具类
原标题:干货:排名前16的Java工具类 作者丨Java技术栈 https://www.jianshu.com/p/9e937d178203 在Java中,工具类定义了一组公共方法,这篇文章将介绍Ja ...
- java编写爬虫_手把手教你从零开始用Java写爬虫
本文将手把手地教大家从零开始用Java写一个简单地爬虫! 目标 爬取全景网图片,并下载到本地 收获 通过本文,你将复习到:IDEA创建工程 IDEA导入jar包 爬虫的基本原理 Jsoup的基本使用 ...
- java有关的论述_中国大学MOOC: 以下有关JAVA线程的论述,正确的是()。
中国大学MOOC: 以下有关JAVA线程的论述,正确的是(). 答:Java 线程由JAVA虚拟机JVM管理 Java 线程创建有两种方法:1)扩展java.lang.Thread类:2)实现Runn ...
- equals null报错吗_轻轻松松教你搞定Java中的==和equals
前言 相信很多读者关于==和equals懂了又懵,懵了又懂,如此循环,事实上可能是因为看到的博客文章之类的太多了,长篇大论,加上一段时间的洗礼之后就迷路了.本篇文章再一次理清楚.当然如果觉得本文太啰嗦 ...
- java 线程的构造函数_[c++11]多线程编程(二)——理解线程类的构造函数
构造函数的参数 std::thread类的构造函数是使用可变参数模板实现的,也就是说,可以传递任意个参数,第一个参数是线程的入口函数,而后面的若干个参数是该函数的参数. 第一参数的类型并不是c语言中的 ...
- 为什么重新new两个线程线程号相同_面试官每次问我关于线程间通信方法,我都回答的很糟糕...
线程的生命周期 废话不多写.首先我们先回顾回顾,理解下线程的生命周期,以及不同的阶段的区别: 新建状态(NEW) 当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时仅由JVM为其分配 ...
- java spring框架 注解_史上最全的java spring注解
史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...
- tomcat线程释放时间_详解tomcat的连接数与线程池
前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...
最新文章
- 用命令行管理你的GitHub项目,不必再开网页,官方CLI工具1.0版今日上线
- Django框架 day02
- 全库检索包含某个值的表名和所在的列.
- js实现搜索框智能提示上下移动效果
- 厉害了,用python爬取自己的微信朋友
- numpy—np.info(function)
- 百度知道,每天电影资源轻松引流赚钱小项目!
- Eclipse 中Alt+/快捷键失效的解决办法。
- Python—字典的操作
- 利用Visual C++ 实现QQ消息群发 ,大神实际测试,已成功发送消息
- 信息安全技术——(九)基于MATLAB数字水印系统设计
- 为什么社区团购模式那么受欢迎和追捧
- ESP-MESH 无线组网,让智能家居通信更方便 | ESP32轻松学(Arduino版)
- mysql secure file_mysql load data secure-file-priv问题
- 007-aven-assembly-plugin和maven-jar-plugin打包,java启动命令
- CSLA公链以“硬实力”成业界翘楚—csla超级公链是真的吗
- Q版京剧脸谱来喽——花旦
- HTML/CSS 新浪注册框
- window各版本回顾
- CVPR 2022 | 刷新low-level视觉多项第一!Restormer:图像复原又一力作!