关注我的公众号:【编程朝花夕拾】,可获取首发内容。
01 引言
池化思想是性能优化的一个重要思想,而线程池池化思想的代表。然而线程池的参数总是让无数开发者懊恼。虽然有有理论公式的参考,但是实际的部署情况千壤之别,老程序员只能通过经验来设置线程池的参数。
今天来介绍一款线程池监控工具,看看如何通过DynamicTp来破局。
02 简介
DynamicTp 是 Dromara 旗下的开源项目(GitHub ⭐ 4.8k+,Gitee ⭐ 2.5k+),针对上述痛点,提供零侵入、全链路、可观测的动态线程池解决方案。

官网地址:dynamictp.cn/
GitHub地址:github.com/dromara/dyn...
Gitee地址:gitee.com/dromara/dyn...
2.1 解决的痛点
使用线程池 ThreadPoolExecutor 过程中你是否有以下痛点呢?
- 代码中创建了一个
ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适 - 凭经验设置参数值,上线后发现需要调整,改代码重新发布服务,非常麻烦
- 线程池相对开发人员来说是个黑盒,运行情况不能及时感知到,直到出现问题
DynamicTp获取可以帮助破局。
2.2 核心功能
- 动态调参: 无需重启,运行时调整线程池参数,立即生效
- 运行监控: 20+ 指标采集,支持 Micrometer、JMX、JsonLog 多方式暴露
- 通知告警: 活性报警、队列阈值、拒绝触发、超时报警,支持企微/钉钉/飞书/邮件
- 配置中心集成: 支持 Nacos、Apollo、Zookeeper、Consul、Etcd 等主流配置中心
- 第三方组件统一管理: 内置 Tomcat、Jetty、Dubbo、RocketMQ、Grpc 等 15+ 组件线程池管理
- SPI 扩展: 核心能力全部提供 SPI 接口,自由个性化扩展
技术上有美团线程池实践背书,已在多家企业生产环境验证。
03 接入
接入非常简单,4步走:
- 引入相应配置中心的依赖
- 配置中心配置线程池实例
- 启动类加 @EnableDynamicTp 注解
- 使用 @Resource 或 @Autowired 进行依赖注入,或通过 DtpRegistry.getExecutor("name") 获取
3.1 引入依赖
我们先使用无注册中心版本,SpringBoot3.x
xml
<dependency>
<groupId>org.dromara.dynamictp</groupId>
<artifactId>dynamic-tp-spring-boot-starter-common</artifactId>
<version>1.2.2-x</version>
</dependency>
3.2 配置
yaml
spring:
application:
name: boot-dynamictp
# 暴露 actuator 端点,用于查看线程池监控
management:
endpoints:
web:
exposure:
include: "*"
# DynamicTp 无配置中心模式(本地配置文件,无动态调参,支持监控告警)
dynamictp:
enabled: true
enabledCollect: true
collectorTypes: micrometer,logging
monitorInterval: 5
# 线程池配置
executors:
- threadPoolName: dtpExecutor1
threadPoolAliasName: 测试线程池
executorType: common
corePoolSize: 4
maximumPoolSize: 8
queueCapacity: 200
queueType: VariableLinkedBlockingQueue
rejectedHandlerType: CallerRunsPolicy
keepAliveTime: 60
threadNamePrefix: dtp-test
allowCoreThreadTimeOut: false
waitForTasksToCompleteOnShutdown: true
awaitTerminationSeconds: 5
preStartAllCoreThreads: false
notifyEnabled: true
3.3 修改启动类

3.4 案例
我们直接使用DtpRegistry的方式。
java
@GetMapping("/info")
public String info() {
DtpExecutor executor = DtpRegistry.getDtpExecutor("dtpExecutor1");
return String.format(
"线程池: %s | core=%d | max=%d | active=%d | queueSize=%d | queueRemaining=%d | completed=%d",
executor.getThreadPoolName(),
executor.getCorePoolSize(),
executor.getMaximumPoolSize(),
executor.getActiveCount(),
executor.getQueue().size(),
executor.getQueue().remainingCapacity(),
executor.getCompletedTaskCount()
);
}
3.5 启动测试

访问:http://localhost:8080/demo/info

访问:http://127.0.0.1:8080/actuator

访问:http://127.0.0.1:8080/actuator/dynamictp

就这么简单,接入已经完成了,正常的使用线程池即可。剩下的就交给DynamicTp
04 小结
本节只是介绍了基本的搭建以及入门,后面继续分享如何接入监控、通知报警等。