在 Java 中,ExecutorService 本身没有直接提供完整的运行时监控 API,但可以通过 标准接口 + 自定义扩展 + 外部工具 来监控其状态。下面从 常用手段 → 代码示例 → 高级方案 系统说明。
ExecutorService executor = Executors.newFixedThreadPool(10);
可获取的状态:
isShutdown():是否已调用 shutdownisTerminated():是否完全结束awaitTermination(timeout):等待结束executor.isShutdown();
executor.isTerminated();
❌ 缺点:
拿不到线程数、队列长度、活跃线程数
ExecutorService 的常用实现是 ThreadPoolExecutor,它提供丰富监控方法。
ThreadPoolExecutor executor = new ThreadPoolExecutor(
10,
20,
60L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100)
);
| 方法 | 含义 |
|---|---|
getPoolSize() |
当前线程数 |
getActiveCount() |
正在执行任务的线程数 |
getCompletedTaskCount() |
已完成任务数 |
getTaskCount() |
总任务数 |
getQueue().size() |
等待队列长度 |
getLargestPoolSize() |
历史最大线程数 |
ScheduledExecutorService monitor = Executors.newSingleThreadScheduledExecutor();
monitor.scheduleAtFixedRate(() -> {
System.out.println("poolSize=" + executor.getPoolSize());
System.out.println("activeCount=" + executor.getActiveCount());
System.out.println("queueSize=" + executor.getQueue().size());
System.out.println("completed=" + executor.getCompletedTaskCount());
}, 0, 5, TimeUnit.SECONDS);
适合统计:
public class MonitorThreadPool extends ThreadPoolExecutor {
public MonitorThreadPool(int core, int max, long keepAlive, TimeUnit unit, BlockingQueue<Runnable> queue) {
super(core, max, keepAlive, unit, queue);
}
@Override
protected void beforeExecute(Thread t, Runnable r) {
System.out.println("任务开始: " + r);
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
System.out.println("任务结束");
}
}
ManagementFactory.getPlatformMBeanServer()
.registerMBean(executor, new ObjectName("threadpool:name=myPool"));
ThreadPoolExecutor executor = ...
ExecutorServiceMetrics.monitor(meterRegistry, executor, "my-executor");
可监控:
new ThreadPoolExecutor(..., new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
System.out.println("任务被拒绝");
}
});
| 方式 | 适用场景 |
|---|---|
| ExecutorService API | 简单状态判断 |
| ThreadPoolExecutor | ✅ 最常用 |
| before/afterExecute | 任务级监控 |
| JMX | 生产环境 |
| Micrometer | 云原生 / 监控平台 |
如果你愿意,我可以:
你现在是 普通 Java 项目还是 Spring Boot?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。