getActiveCount()和getCompletedTaskCount()分别反映线程池实时负载与历史完成任务量;前者表征当前活跃线程数,用于判断资源吃紧或过载;后者为累计完成任务数,用于计算处理速率及发现卡死、拒绝等问题;二者联动可识别执行变慢、健康高效、调度中断等典型运行态。

getActiveCount() 和 getCompletedTaskCount() 是 ThreadPoolExecutor 提供的两个关键监控指标,它们不反映吞吐量或延迟,而是分别刻画线程池“当下正在忙什么”和“历史总共干成了什么”,在监控看板中承担不可替代的诊断角色。
getActiveCount():实时负载水位的直观标尺
该方法返回当前正在执行任务的线程数(即非空闲工作线程数量),是判断线程池是否“吃紧”的第一信号:
- 持续接近核心线程数 → 池内资源已常态化利用,需关注任务排队情况
- 长期等于最大线程数 → 线程扩容已达上限,若配合高队列积压,说明系统已过载
- 突增后快速回落 → 可能是短时流量尖峰,结合时间轴可识别周期性压力源
注意:它不区分是核心线程还是新创建的临时线程,只看“此刻有没有在 run()”,因此比单纯看线程数更贴近业务真实并发压力。
getCompletedTaskCount():衡量稳定性和处理能力的累计基线
该值表示自线程池创建以来成功完成的任务总数,是构建“单位时间完成量”(如 QPS、TPS)的核心分子:
- 与采集周期结合,可计算平均处理速率(例:10 秒内从 12000 增至 12500 → 500 QPS)
- 长时间无增长 + activeCount > 0 → 存在任务卡死、阻塞未释放、异常静默失败等隐患
- 增速明显低于上游请求量 → 需排查拒绝策略触发、下游依赖瓶颈或任务内部慢逻辑
它不包含被拒绝或抛出未捕获异常而中断的任务,因此是“有效交付”的保守统计口径。
二者联动:识别典型运行态的关键组合
单独看任一指标易误判,但两者交叉分析能定位常见问题模式:
- activeCount 高 + completedTaskCount 增速缓 → 任务执行变慢(如 DB 响应升高、GC 频繁)
- activeCount 低 + completedTaskCount 增速快 → 任务轻量、线程复用率高,属健康高效态
- activeCount 持续为 0 + completedTaskCount 不动 → 任务提交中断、调度器停摆或监控未刷新
- activeCount 波动剧烈 + completedTaskCount 增长平滑 → 任务粒度差异大,或存在批量/单点混合负载
接入监控看板的实用建议
将这两个值纳入 Prometheus + Grafana 或类似体系时,推荐以下实践:
- 对 getActiveCount() 做百分比归一化(如 ÷ maxPoolSize),便于跨环境横向对比
- getCompletedTaskCount() 必须使用「差值」而非原始值绘图,避免计数器重置导致断崖(Prometheus 中用 rate() 或 increase())
- 搭配 queue.size() 和 getTaskCount()(总提交数)一起展示,可推导拒绝率、平均排队时长等衍生指标
- 设置 activeCount 持续超阈值(如 > 90% max)的告警,比仅盯 CPU 更早暴露线程级瓶颈










