在 Java 中,ExecutorService 本身没有内置的监控接口,但可以通过线程池状态、队列、任务统计、JMX、日志、自定义封装等方式来监控。下面按实用程度给你一个完整方案。
如果你用的是 ThreadPoolExecutor(大多数线程池都是),可以直接拿到很多监控数据。
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(4);
int poolSize = executor.getPoolSize(); // 当前线程数
int activeCount = executor.getActiveCount(); // 正在执行任务的线程数
long completedTaskCount = executor.getCompletedTaskCount(); // 已完成任务数
long taskCount = executor.getTaskCount(); // 总任务数(已完成 + 队列中)
int queueSize = executor.getQueue().size(); // 等待队列长度
✅ 核心监控指标
| 指标 | 含义 |
|---|---|
| poolSize | 当前线程数 |
| activeCount | 活跃线程数 |
| taskCount | 提交的任务总数 |
| completedTaskCount | 已完成任务数 |
| queue.size() | 排队任务数 |
ScheduledExecutorService monitor = Executors.newSingleThreadScheduledExecutor();
monitor.scheduleAtFixedRate(() -> {
System.out.println("active=" + executor.getActiveCount()
+ ", pool=" + executor.getPoolSize()
+ ", queue=" + executor.getQueue().size()
+ ", completed=" + executor.getCompletedTaskCount());
}, 0, 5, TimeUnit.SECONDS);
✅ 适合:开发、测试、简单生产环境
public class MonitorTask implements Runnable {
private final Runnable task;
public MonitorTask(Runnable task) {
this.task = task;
}
@Override
public void run() {
long start = System.currentTimeMillis();
try {
task.run();
} finally {
long cost = System.currentTimeMillis() - start;
System.out.println("task cost=" + cost + "ms");
}
}
}
使用:
executor.execute(new MonitorTask(() -> {
// 业务代码
}));
@ManagedResource
public class ThreadPoolMonitor {
private final ThreadPoolExecutor executor;
public ThreadPoolMonitor(ThreadPoolExecutor executor) {
this.executor = executor;
}
@ManagedAttribute
public int getActiveCount() {
return executor.getActiveCount();
}
@ManagedAttribute
public int getPoolSize() {
return executor.getPoolSize();
}
@ManagedAttribute
public long getCompletedTaskCount() {
return executor.getCompletedTaskCount();
}
@ManagedAttribute
public int getQueueSize() {
return executor.getQueue().size();
}
}
注册:
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
ObjectName name = new ObjectName("com.example:type=ThreadPool");
server.registerMBean(new ThreadPoolMonitor(executor), name);
✅ 可用 JConsole / VisualVM / Prometheus + JMX Exporter 查看
如果你在 Spring Boot / 微服务中:
ThreadPoolExecutor executor = new ThreadPoolExecutor(
4, 4, 0, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>());
ExecutorServiceMetrics.monitor(
Metrics.globalRegistry,
executor,
"biz-thread-pool"
);
可监控:
✅ 可接入 Prometheus + Grafana
executor.isShutdown(); // 是否已调用 shutdown
executor.isTerminated(); // 是否完全停止
常用于:
| 指标 | 警告 | 严重 |
|---|---|---|
| 队列长度 | > 1000 | > 5000 |
| 活跃线程数 | 接近 maxPoolSize | 长时间满 |
| 任务耗时 | > 1s | > 5s |
| 拒绝任务 | > 0 | 持续增长 |
✅ 最佳实践
如果你愿意,可以告诉我:
我可以直接给你一套可复制的完整监控方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。