我们公司开发的一个线程池框架,基于JDK原生的线程池,名为HThreadPool ,优点如下:
- 通过 nacos 可以动态修改线程池的参数,且实时生效。
- 通过提供http接口,来返回当前线程池的各项指标。
- 内部包装了JDK的ThreadPoolExecutor , 线程池功能都是原生的。
- 集成简单,只需引入一个starter, 然后配置nacos地址即可。
效果测试
nacos上配置线程池参数:
启动程序,查看监控(通过提供http接口方式):
- activeCount : 正在工作的线程数,当前0,因为我们还没提交任务。
- corePoolSize: 核心线程数为5,因为我们nacos配置就是5。
- maximumPoolSize: 最大线程5, 我们nacos配置就是5。
- queueUsedSize : 队列里面挂起的任务数,目前为0。
我们向队列中提交6次任务, 任务里面是无限循环,在查看监控:
我们发现 activeCount 为 5 , 也就是说 有5个线程在工作了。
queueUsedSize 为1, 因为我们提交了6个任务,所以一个任务由于没有可用线程了,导致挂到队列里面。
此时,我们可以通过动态修改线程池的核心线程数和最大线程数来让它把挂起的任务给执行掉!
修改nacos配置:
此时,我们的程序已经执行了第6个任务了,再次查看监控:
activeCount 变成了6 , queueUsedSize 变成了0 , 说明我们挂起的任务被自动执行了。
用法
项目中引入maven:
<dependency>
<groupId>com.h.threadpool</groupId>
<artifactId>h-threadpool-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
# 指定线程池的名称
hthreadpool.nam = 订单服务线程池
# 指定nacos配置地址
hthreadpool.config_host = 121.4.189.227:8848
# 指定nacos dataId
hthreadpool.config_dataId = uc-order.yml
# 指定 nacos group
hthreadpool.config_groupId = DEFAULT_GROUP
提交任务:
@RestController
public class OrderController {
@Autowired
HThreadPoolExecutor threadPoolExecutor;
@GetMapping("/set")
public void set() {
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
System.out.println("任务提交成功");
try {
Thread.sleep(1000000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
监控中心
当启动你的微服后,会在当前机器上开启一个http端口,用来获取当前线程池的指标数据, 路径如下:
监控格式数据:
{
"activeCount":6,
"activeUsedPercent":"100%",
"corePoolSize":6,
"maximumPoolSize":6,
"queueRemainSize":1024,
"queueTotalSize":1024,
"queueUsedPercent":"0%",
"queueUsedSize":0,
"rejectedClass":"java.util.concurrent.ThreadPoolExecutor$AbortPolicy",
"taskCompletedSize":0
}
字段解释:
public class ThreadPoolNature {
/***
* 队列总大小
*/
private int queueTotalSize;
/***
* 队列已经使用大小
*/
private int queueUsedSize;
/***
* 队列剩余大小
*/
private int queueRemainSize;
/**
* 隊列使用 百分比
*/
private String queueUsedPercent;
/***
* 任务完成的数量
*/
private long taskCompletedSize;
/***
* 活动线程数
*/
private int activeCount;
/***
* 最大线程数
*/
private int maximumPoolSize;
/***
* 核心线程数
*/
private int corePoolSize;
/**
* 线程使用百分比 (活动线程/最大线程数)
*/
private String activeUsedPercent;
/***
* 拒绝策略类
*/
private String rejectedClass;
}
动态配置中心
可修改的配置指标有:
# 核心线程数
hthreadpool.corePoolSize: 6
# 最大线程数
hthreadpool.maximumPoolSize: 6
# 保活时间,单位毫秒
hthreadpool.keepAliveTime: 100
# 队列大小
hthreadpool.queueSize: 10
# 拒绝策略
hthreadpool.rejectedExecutionHandler: java.util.concurrent.ThreadPoolExecutor.AbortPolicy
代码结构
分为三大核心:
- 配置中心
- 监控中心
- 线程池中心