在 Java 中,ExecutorService 本身不会自动“销毁”线程,而是通过线程池的管理策略来回收(复用或终止)线程。理解“回收”要从两个层面看:
下面系统说明。
ExecutorService executor = Executors.newFixedThreadPool(10);
executor.execute(() -> {
// 任务执行完,线程回到池中
});
Executors.newFixedThreadPool(n)
shutdown()✅ 适合:稳定负载
Executors.newCachedThreadPool()
// 60 秒内无任务 → 线程被真正回收
✅ 适合:大量短任务
⚠ 风险:线程数可能爆炸
Executors.newScheduledThreadPool(n)
new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
TimeUnit.SECONDS,
workQueue
);
| 参数 | 作用 |
|---|---|
| corePoolSize | 核心线程数 |
| maximumPoolSize | 最大线程数 |
| keepAliveTime | 非核心线程空闲回收时间 |
| allowCoreThreadTimeOut | 是否回收核心线程 |
keepAliveTime → 回收executor.allowCoreThreadTimeOut(true);
executor.shutdown(); // 平缓关闭
// 或
executor.shutdownNow(); // 立即关闭
shutdown()
shutdownNow()
⚠ 不调用 shutdown,线程永远不会回收
错,线程回到池中复用
错,必须手动 shutdown
只有 CachedThreadPool 可能,Fixed / ThreadPoolExecutor 有上限
✅ 使用 ThreadPoolExecutor 明确参数
✅ 使用 try-finally 或 Spring @PreDestroy 关闭
✅ 给线程起名字,方便排查
✅ 合理设置 keepAliveTime
ExecutorService executor = new ThreadPoolExecutor(
4, 8, 30, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100)
);
ExecutorService 的“线程回收”= 任务结束后线程复用;
真正释放线程资源 = 空闲超时或显式 shutdown。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。