极高 进阶
线程池核心参数与执行流程#
一句话答案#
7 参数(core/max/keepAlive/queue/factory/handler),执行流程:< core 新建→队列→< max 新建→拒绝策略。
核心要点
执行流程:
- 线程数 < core → 创建新线程
- core已满 → 放入队列
- 队列满 → 创建非核心线程(到max)
- max也满 → 执行拒绝策略
口诀: 核最存活队工拒
注意: 不要用Executors(FixedThreadPool队列无界/CachedThreadPool线程无上限)
面试回答(2分钟版)
线程池 ThreadPoolExecutor 构造函数有七个核心参数:corePoolSize 核心线程数、maximumPoolSize 最大线程数、keepAliveTime 非核心线程空闲存活时间、时间单位 unit、workQueue 工作队列、threadFactory 线程工厂、handler 拒绝策略。执行流程分四步:任务提交时如果当前线程数小于 corePoolSize,直接创建核心线程执行;核心线程满了就把任务放入 workQueue 排队;队列也满了才创建非核心线程,最多到 maximumPoolSize;线程数到了 max 且队列也满,则执行拒绝策略。注意关键点:不是核心满了就扩线程,而是先排队,队列满了才扩。四种内置拒绝策略中 AbortPolicy 抛异常是默认的,CallerRunsPolicy 让提交者自己执行。阿里规范禁止用 Executors 创建线程池,因为 FixedThreadPool 用的 LinkedBlockingQueue 无界队列可能导致 OOM,CachedThreadPool 最大线程数是 Integer.MAX_VALUE 可能创建过多线程,生产环境必须用 ThreadPoolExecutor 手动指定参数。
追问与易错
追问方向:
- “为什么不推荐用 Executors 创建线程池?”→ FixedThreadPool 队列无界可能 OOM,CachedThreadPool 线程无上限
- “核心线程会被回收吗?”→ 默认不会,allowCoreThreadTimeOut(true) 可以
- “线程池的线程是怎么复用的?”→ Worker 循环从 BlockingQueue 取任务
易错点:
- ❌ “核心线程满了直接创建非核心线程”——先放队列,队列满了才创建非核心线程
- ❌ “线程池中的线程和普通线程一样”——线程池的线程在 run 方法中循环取任务,不会结束