线程池有用过吗 七大参数 如何配置 拒绝策略
最近面试老被问线程池?别慌!今天咱就掰开揉碎了聊聊线程池的七大参数、配置技巧和核心拒绝策略,全是干货,面试直接照着说就行。
📁 2025年Java面试宝典资源:
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g
二、线程池到底是个啥?你用没用过?
面试官问“线程池有用过吗”,千万别只回个“用过”。得说清楚场景!比如:“在项目里处理批量订单状态更新、异步发消息通知这些高并发但轻量级的任务时,用ThreadPoolExecutor创建的线程池来管理线程资源,避免频繁创建销毁线程的开销。” 这就显得你真有实战经验。

三、必须吃透的线程池七大参数
线程池的核心全在这七个参数里了,ThreadPoolExecutor的构造器就是它们:
corePoolSize(核心线程数):
线程池的“基本盘”,就算没活干,这些线程也常驻内存。比如设10,那最少有10个线程待命。maximumPoolSize(最大线程数):
活太多时的“临时工”上限。核心线程忙不过来,且任务队列满了,才会创建新线程(不超过这个数)。keepAliveTime(线程空闲存活时间):
临时工(超出核心数的线程)多久没活干就解散。得配个时间单位(秒/毫秒)。unit(存活时间单位):
上面时间的单位,比如TimeUnit.SECONDS。workQueue(任务队列):
核心线程忙不过来时,新任务就在这排队。常用LinkedBlockingQueue(无界要小心OOM)或ArrayBlockingQueue(有界)。threadFactory(线程工厂):
定制线程创建(比如给线程起个有意义的名字,方便排查)。默认也行,但知道它能定制是加分项。handler(拒绝策略):
关键! 当线程池满负荷(所有线程忙 + 队列满)时,怎么处理新来的任务。这就是常问的拒绝策略。
四、线程池参数怎么配?不是拍脑袋的!
如何配置线程池参数是面试高频题。别只背公式,说思路:
- CPU密集型任务(计算为主):
corePoolSize≈maximumPoolSize= CPU核数 + 1。队列别太大,避免堆积。核心是别让线程数远超CPU核数,减少上下文切换开销。 - IO密集型任务(等待IO多):
corePoolSize可以设大点,比如 2 * CPU核数。maximumPoolSize也可以更大些(如 4 * CPU核数),因为线程很多时间在等,CPU利用率不高。队列可以用大点的LinkedBlockingQueue。 - 混合型任务:拆分!或者按经验值设,再根据监控调整。
万能公式(参考):线程数 = CPU核数 * 目标CPU利用率 * (1 + 平均等待时间 / 平均计算时间)。强调监控和调优更重要。

五、线程池的四大拒绝策略(RejectedExecutionHandler)
当线程池和队列都满了,新任务咋办?全靠拒绝策略!JDK内置了4种:
AbortPolicy(默认):
直接抛RejectedExecutionException异常!简单粗暴,生产环境小心用,容易崩。CallerRunsPolicy:
“退回给调用者执行”。哪个线程(比如主线程)提交的任务,就让哪个线程自己去跑这个任务。好处是提交任务的速度会自然降下来,不会完全不管。比较常用也推荐!DiscardPolicy:
默默把新任务丢掉,当无事发生。不推荐!可能丢关键数据。DiscardOldestPolicy:
把队列里最老(最早进来)的那个任务丢掉,然后尝试把新任务加进队列。慎用! 可能把重要的老任务丢了。
面试回答示例: “我们项目常用CallerRunsPolicy,因为它能保证任务不丢失,并且让调用线程自己执行,相当于一种负反馈,能减缓任务提交速度,避免雪崩。对于绝对不能丢的任务,我们可能会配合持久化队列自己做更复杂的处理。”
六、总结与资源
搞定线程池的七大参数、合理配置资源、选对拒绝策略,面试官问线程池这块你基本就稳了。核心就是理解每个参数的作用和相互制约关系,以及拒绝策略如何兜底。
想系统刷Java面试题? 这份资料超全:
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g
特别提示: 如果你需要购买面试鸭会员,可以通过 面试鸭返利网 (mianshiyafanli.com) 找到我下单,可额外返利25元!实实在在的优惠。



