线程池创建需要的参数、如何设置参数、线程池的运行过程、高并发下如何使用线程池
最新资源:2025年Java面试宝典已整理
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g
一、线程池创建需要的参数
面试官常问:“线程池创建需要哪些参数?” 其实就这7个:
- corePoolSize:核心线程数,即使空闲也不会销毁
- maximumPoolSize:最大线程数(救急线程上限)
- keepAliveTime:非核心线程的空闲存活时间
- unit:存活时间单位(秒/毫秒等)
- workQueue:任务阻塞队列(ArrayBlockingQueue/LinkedBlockingQueue)
- threadFactory:线程创建工厂(可自定义线程名)
- handler:拒绝策略(AbortPolicy/CallerRunsPolicy等)

二、如何设置参数
参数设置是面试高频考点,需结合业务场景:
- CPU密集型任务(如计算):
核心线程数 = CPU核数 + 1,避免过多线程导致上下文切换 - IO密集型任务(如网络请求):
核心线程数 = 2 * CPU核数,充分利用等待时间 - 队列选择:
- 需要控制并发量用有界队列(如ArrayBlockingQueue)
- 吞吐量优先用无界队列(如LinkedBlockingQueue)
- 拒绝策略:
- 默认AbortPolicy(直接抛异常)
- 需保证任务不丢失用CallerRunsPolicy(由提交线程执行)
三、线程池的运行过程
记住这个处理流程(面试必背):
- 提交任务时,优先使用核心线程处理
- 核心线程满载时,任务进入阻塞队列排队
- 队列满后,启动非核心线程处理新任务(不超过maxPoolSize)
- 线程数达最大值且队列满时,触发拒绝策略
graph LR
A[提交任务] --> B{核心线程空闲?}
B -->|是| C[核心线程处理]
B -->|否| D{队列未满?}
D -->|是| E[进入队列等待]
D -->|否| F{可创建非核心线程?}
F -->|是| G[创建新线程处理]
F -->|否| H[执行拒绝策略]
四、高并发下如何使用线程池
高并发场景的线程池调优策略:
- 动态参数调整
使用setCorePoolSize()动态扩容(如电商大促期间) - 监控关键指标
// 获取线程池状态 executor.getActiveCount(); // 活动线程数 executor.getQueue().size(); // 队列积压量 - 拒绝策略优化
自定义策略记录任务并异步重试:new RejectedExecutionHandler() { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { // 写入Redis/Kafka等待补偿 } } - 隔离策略
重要业务使用独立线程池(避免资源抢占)

特别提示:如果你准备系统化提升面试能力,可通过面试鸭返利网联系我购买会员,额外返利25元(官方渠道无返利)!
更多面试真题解析可访问:面试鸭返利网



