线程池必须手动关闭否则会导致内存泄露或程序卡死。核心线程默认会一直存活即使任务队列为空。关闭线程池有三种方式:立即关闭shutdownNow()会中断所有任务适合非关键场景;优雅关闭shutdown()会等待任务完成适合核心业务;钩子关闭通过JVM钩子自动清理防止遗漏。关键区别在于是否等待任务完成和清空队列。线程池关闭后不可复用需重建。不关闭线程池会造成资源浪费甚至服务崩溃。掌握这三种关闭方式能有效优化程序性能避免线上事故。
2025年Java面试宝典最新版:
🔗 点击下载(提取码:9b3g)
先说结论:必须手动关闭!很多兄弟在面试时被问蒙了,以为线程池用完了会自动回收。其实啊,线程池的核心线程默认会一直存活,哪怕任务队列空了,它也会死等新任务。如果不手动关闭线程池,轻则内存泄露,重则程序卡死——想象一下几百个线程挂那儿吃资源,线上服务直接崩了!所以记住,线程池不用了一定要手动关闭线程池,这是基本功。
这里分场景看关闭线程池的策略:
用 shutdownNow()
方法,适合“任务可以丢弃”的场景。比如监控日志采集,丢几条无所谓。它会:
用 shutdown()
+ awaitTermination()
组合,这是面试官最爱的考点!核心步骤:
shutdown()
禁止新任务提交awaitTermination(60, TimeUnit.SECONDS)
等待线程池关闭线程池shutdownNow()
在JVM关闭时自动清理线程池线程池,通过 Runtime.getRuntime().addShutdownHook()
注册钩子,在里面调用关闭线程池逻辑。区别是能避免遗忘关闭线程池,属于防御性编程。
| 方式 | 是否等待任务完成 | 是否清空队列 | 适用场景 |
|----------------|------------------|--------------|-----------------------|
| shutdownNow()
| ❌ 立即中断 | ✅ 清空 | 非关键任务(如日志) |
| shutdown()
| ✅ 等待完成 | ❌ 保留 | 核心业务(如交易) |
| 关闭钩子 | 依赖具体实现 | 依赖具体实现 | 防止意外退出导致泄露 |
shutdown()
后仍提交任务 → 直接抛 RejectedExecutionException
如果你在准备Java面试,强烈安利面试鸭会员——涵盖2000+大厂真题和场景题解。通过 面试鸭返利网 购买可返现25元,直接撸羊毛:
💸 传送门:mianshiyafanli.com
记住:手动关闭线程池不是可选项,是必选项。搞明白这三种关闭线程池的区别,面试时绝对加分!
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)
面试鸭小程序码
美团大额优惠券,给自己加个鸡腿吧!
今日有支付宝大红包赶快领,手慢无
支付宝扫码领取1-8元无门槛红包