type
Post
status
Published
date
Feb 13, 2025
slug
java/thread
summary
tags
Java
Thread
category
技术分享
icon
password
URL
1. 线程池核心参数
- 线程池核心参数
- 任务进来,由 threadFactory(线程工厂) 创建线程,优先不超过 corePoolSize(核心线程数)。
- 核心线程满了,任务进入 workQueue(阻塞队列) 排队。
- 队列也满了,才开始创建非核心线程,总线程数不超过 maximumPoolSize(最大线程数)。
- 非核心线程空闲超过 keepAliveTime(存活时间),由 unit(时间单位) 控制时长,就会被回收。
- 总线程达到最大、队列也满,新任务触发 handler(拒绝策略)。
corePoolSize:核心线程数(常驻)
maximumPoolSize:最大线程数
keepAliveTime:非核心线程空闲存活时间
unit:时间单位
workQueue:阻塞队列
threadFactory:线程工厂
handler:拒绝策略
2. 线程池执行流程/执行任务的完整流程
先创建核心线程执行
核心线程满了 → 进入阻塞队列
队列满了 → 创建非核心线程
非核心也满了 → 执行拒绝策略
3. 阻塞队列常用3种
ArrayBlockingQueue(生产使用):有界数组队列
LinkedBlockingQueue:链表队列
SynchronousQueue:不存元素,直接移交
4. 拒绝策略
AbortPolicy:直接抛异常(默认)
CallerRunsPolicy(生产推荐):让提交任务的线程自己执行
DiscardPolicy:直接丢掉任务
DiscardOldestPolicy:丢掉队列最老的任务
5. Executors提供的4种线程池?生产用哪个?
(生产)newFixedTreadPool:固定线程数,队列无界,风险:OOM
newCachedTreadPool:核心0,最大无限,队列不存,风险:无限创建,崩溃
newSingleThreadExecutors:单线程,串行执行,风险:队列无界,OOM
newScheduledTreadPool:定时、周期执行任务
6. 阿里为什么禁用Exectors?
因为队列或线程数无界,高并发下容易OOM或线程过多卡死。建议手动new ThreadPoolExecutor
7. 怎么设置线程池大小?
CPU密集型:核心数 = CPU + 1
IO密集型:核心数 = CPU核心数 * 2
8. 线程池中的线程是怎么复用的?
线程执行完不会销毁,会循环从阻塞队列take(),达到服用
9. 线程执行中抛异常会怎么样?线程会被回收吗?
未捕获的异常,线程立刻终止,线程对象变成垃圾,最终会被回收
10. execute和submit区别?
execute():无返回值,任务抛异常直接抛出
submit():返回Future,异常被吃掉,需get()才抛出
11. 线程池shutdown和shutdownNow区别?
shutdown:不接新任务,跑完已有的。
shutdownNow:立即结束,尝试中断正在执行的
12. 线程池监控指标看哪些?
队列不积压、活跃线程不长期打满、任务完成率平稳
queue.size()队列积压,activeCount活跃线程,completedTaskCount增长缓慢,poolsize长期维持在max说明核心线程不够
13. 线程池有哪五种状态?怎么流转?
RUNNING:运行中,接收新任务
SHUTDOWN:关闭,不接收新任务,执行已有的
STOP:停止,不接受,不处理,中断正在执行的
TIDYING:整理中,所有任务结束,线程数归0
TERMINATED:终止完成
14. 为什么核心线程默认不会自动回收?怎么开启回收?
为了减少线程创建开销,一直待命,响应更快。
allowCoreThreadTimeOut(true)
15. 线程池ctl变量是干嘛的?
高3位存状态,低29位存工作线程数,通过位运算实现状态和线程数的原子更新,保证线程安全。

- 作者:鹿鹿鹿
- 链接:https://luxiaopeng.com/article/java/thread
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

一文吃透 Java 线程池:核心参数、执行流程与生产实践





