🔍 Java线程池工作原理深度拆解(附2025面试高频考点)
👉2025年Java面试宝典最新版下载
(内含线程池底层源码解析+大厂真题实战)
线程池存在的价值是什么?
想象你开了一家快递站,每次有包裹到来都临时雇人送货——这会产生多大开销?Java线程池就是解决这类资源复用问题的设计。程序不用频繁创建/销毁线程,而是像管理快递员团队一样:核心线程长期待命,临时包裹交给空闲线程,超出处理能力时放入队列缓冲。

最近帮学员改简历时发现,超过80%的Java面试官会追问线程池参数设置逻辑,特别是当面试者提到"高并发"项目经验时。这就像快递站老板要清楚:日常该养多少正式工?仓库最多堆多少包裹?临时工最多招多少?
线程池七大核心参数
用ThreadPoolExecutor构造函数举例:
new ThreadPoolExecutor(
corePoolSize, //正式员工数(不退租)
maximumPoolSize, //临时工+正式工总数上限
keepAliveTime, //临时工摸鱼多久会被辞退
unit, //时间单位
workQueue, //包裹暂存仓库
threadFactory, //员工培训部门
handler //仓库爆仓后的应急方案
);
面试高频问题:corePoolSize=5,maxPoolSize=10,队列capacity=100的情况下,突然涌入200个任务会发生什么?
答案是:前5个任务创建核心线程执行,接下来100个存入队列,再新到的95个任务触发创建临时线程(总数不超过maxPoolSize=10),最后超出的任务触发拒绝策略。
任务执行流程图解

- 新任务到来时优先使用核心线程
- 核心线程全忙时存入工作队列
- 队列满后才会创建临时线程
- 超过maxPoolSize触发拒绝策略
特别提醒:很多新手以为队列满了才会创建临时线程,实际上当核心线程已满且队列未满时,任务会直接入队而不扩容线程。这点在笔试选择题里经常设坑!
四种拒绝策略对比
- AbortPolicy:直接抛RejectedExecutionException(默认策略)
- CallerRunsPolicy:让提交任务的线程自己执行(相当于老板亲自送货)
- DiscardOldestPolicy:丢弃队列最老的任务(把积压最久的包裹扔掉)
- DiscardPolicy:默默丢弃新任务(新包裹直接拒收)
面试时可能会让你手写自定义拒绝策略。比如把拒绝的任务持久化到数据库,等系统负载降低时重新提交。这里要注意处理策略不能阻塞主线程。
如何避免线程池OOM?
上周有学员在实战项目中遇到线程池导致的内存溢出,根本原因是:
❌ 使用无界队列(比如LinkedBlockingQueue未设置容量)
❌ 设置过大的maxPoolSize(比如Integer.MAX_VALUE)
✅ 正确做法是:
- 根据CPU核数设置合理的核心线程数
- 使用有界队列并监控队列堆积情况
- 配合降级策略(比如Hystrix)

🚀 面试福利时刻
准备面试的同学注意啦!通过面试鸭返利网购买面试鸭会员可立减25元,官方正品保障还能额外领取各厂最新面经合集。最近很多学员反馈,靠着返利省下的钱正好能再买本《JVM成神之路》!
更多线程池高频面试题:
- 线程池如何实现线程复用?
- shutdown()和shutdownNow()区别?
- 如何监控线程池运行状态?
(完整答案见开头提供的面试宝典)


