Lazy loaded image
技术分享
Lazy loaded image一文吃透 Java 线程池:核心参数、执行流程与生产实践
字数 980阅读时长 3 分钟
2025-2-13
2026-3-14
type
Post
status
Published
date
Feb 13, 2025
slug
java/thread
summary
tags
Java
Thread
category
技术分享
icon
password
URL

1. 线程池核心参数

  1. 线程池核心参数
  1. 任务进来,由 threadFactory(线程工厂) 创建线程,优先不超过 corePoolSize(核心线程数)
  1. 核心线程满了,任务进入 workQueue(阻塞队列) 排队。
  1. 队列也满了,才开始创建非核心线程,总线程数不超过 maximumPoolSize(最大线程数)
  1. 非核心线程空闲超过 keepAliveTime(存活时间),由 unit(时间单位) 控制时长,就会被回收。
  1. 总线程达到最大、队列也满,新任务触发 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位存工作线程数,通过位运算实现状态和线程数的原子更新,保证线程安全。
 
 
notion image
上一篇
PHP结合Redis实现高并发下的抢购、秒杀功能
下一篇
一文吃透:二叉树、AVL、红黑树、B 树、B + 树 全解析