本项目是一个完整的前后端分离系统,核心是自研的 AdaptiveBufferedThreadPoolExecutor(自适应缓冲线程池),解决了传统 JDK ThreadPoolExecutor 在高并发场景下频繁触发拒绝策略、导致大量任务丢失的痛点问题。
围绕该线程池,构建了一套可视化的任务调度监控平台,实现了任务全生命周期追踪、线程池运行状态实时监控、ABTP vs JDK 压测对比、动态参数热更新等核心功能。
| 分支 | 内容 | 技术栈 |
|---|---|---|
main |
后端代码 | Spring Boot + MyBatis-Plus + MySQL + Redis + WebSocket |
frontend |
前端代码 | Vue3 + Element Plus + ECharts + Axios |
| 层次 | 技术 |
|---|---|
| 核心线程池 | 自研 AdaptiveBufferedThreadPoolExecutor(基于 AQS + CAS) |
| 后端框架 | Spring Boot 3.3.2 |
| 持久层 | MyBatis-Plus 3.5.5 + MySQL |
| 缓存 | Redis(监控指标缓存 + 历史趋势数据) |
| 实时通信 | WebSocket(1秒级指标推送) |
| 系统监控 | JMX OperatingSystemMXBean(CPU 负载采集) |
| 前端框架 | Vue3 + Vite |
| UI 组件 | Element Plus |
| 数据可视化 | ECharts(折线图 / 柱状图 / 面积图) |
| 部署 | Sealos 云平台 |
在 JDK ThreadPoolExecutor 基础上做了两项核心改造:
- Buffer Factor 缓冲策略:引入缓冲因子参数(0~1),控制队列填充到多少比例后才开始扩展线程。IO 密集型业务设大值优先填队列,CPU 密集型业务设小值优先扩线程。
- 防拒绝强制入队机制:当线程池满载时,根据 CPU 负载和线程负载双维度判断:
- CPU 低 + 线程负载低 → 阻塞等待入队
- CPU 低 + 线程负载高 → CPU 空转 + 指数退避重试
- CPU 高 + 线程负载高 → 尝试一次入队,失败才真正拒绝
- 后端通过
@Scheduled每秒采集线程池指标(活跃线程数、队列深度、CPU 负载、已完成任务数) - 通过 WebSocket 实时推送至前端
- 前端使用 ECharts 渲染动态折线图,支持最近 60 秒的滚动展示
- Redis 缓存最近 5 分钟历史数据,支持页面刷新后查看趋势
- 支持自定义参数(核心线程数、最大线程数、队列大小、任务总数、Buffer Factor)
- 一键对比 ABTP vs JDK ThreadPool 的拒绝次数、成功率、总耗时
- 支持测试不同 Buffer Factor 值对系统吞吐的影响,生成柱状图 + 折线图
- 前端滑块调节核心线程数、最大线程数、空闲超时时间
- 调用线程池的
setCorePoolSize()、setMaximumPoolSize()等方法 - 零停机生效,无需重启服务
- 每个任务拥有唯一 taskId,状态流转:
PENDING → RUNNING → SUCCESS / FAILED - TaskWrapper 包装器记录任务开始时间、执行耗时、异常信息
- 前端任务列表支持按状态筛选、分页查询
- IO 密集型:
Thread.sleep()模拟网络等待,线程释放 CPU - CPU 密集型:死循环浮点运算,强制占用 CPU 资源
- 监控大盘可直观观察两种任务类型对系统资源的不同影响
| 指标 | JDK ThreadPool | ABTP |
|---|---|---|
| 任务执行成功率 | ~6.5% | 100% |
| 拒绝策略触发次数 | 1870 次 | 0 次 |
| 参数调节方式 | 重启服务 | 零停机热更新 |
| 监控数据延迟 | 无 | < 1 秒(WebSocket) |
git checkout main
mvn clean package -DskipTests
java -jar target/backend-1.0.0.jar
前端启动(frontend 分支)
git checkout frontend
npm install
npm run dev
数据库初始化
CREATE DATABASE IF NOT EXISTS taskplatform DEFAULT CHARACTER SET utf8mb4;
-- 详见 main 分支中的建表 SQL
📁 后端目录结构(main 分支)
<TEXT>
src/main/java/com/taskplatform/
├── config/ # 配置类(线程池、跨域、WebSocket、Redis、Jackson)
├── controller/ # REST 接口(任务、监控、压测、参数调节)
├── service/ # 业务逻辑(任务管理、告警检测)
├── mapper/ # MyBatis-Plus 数据访问层
├── entity/ # 数据库实体类
├── pool/ # 核心线程池 + 指标采集器 + 任务包装器
├── websocket/ # WebSocket 实时推送
└── vo/ # 统一返回格式
📁 前端目录结构(frontend 分支)
<TEXT>
src/
├── api/ # 后端接口调用
├── views/ # 页面(监控大盘、任务提交、压测对比、参数调节)
├── utils/ # 工具类(Axios 封装、WebSocket 封装)
├── router/ # 路由配置
├── App.vue # 主布局(侧边栏 + 内容区)
└── main.js # 入口文件
👤 作者
[lurk]
📄 License
MIT