外观
一句话答案
7 参数(core/max/keepAlive/queue/factory/handler),执行流程:< core 新建→队列→< max 新建→拒绝策略。
核心要点
执行流程:
- 线程数 < core → 创建新线程
- core已满 → 放入队列
- 队列满 → 创建非核心线程(到max)
- max也满 → 执行拒绝策略
口诀: 核最存活队工拒
注意: 不要用Executors(FixedThreadPool队列无界/CachedThreadPool线程无上限)
追问与易错
追问方向:
- 为什么不推荐用 Executors 创建线程池?(FixedThreadPool 队列无界可能 OOM,CachedThreadPool 线程无上限)
- 核心线程会被回收吗?(默认不会,allowCoreThreadTimeOut(true) 可以)
- 线程池的线程是怎么复用的?(Worker 循环从 BlockingQueue 取任务)
易错点:
- ❌ "核心线程满了直接创建非核心线程"——先放队列,队列满了才创建非核心线程
- ❌ "线程池中的线程和普通线程一样"——线程池的线程在 run 方法中循环取任务,不会结束
💡 记忆锚点
线程池执行流程像公司招人:核心员工没满直接招(core),满了把活放到待办清单排队(queue),待办也满了就招临时工(到 max),临时工也满了就启动拒绝策略。注意:不是核心满了就招临时工——先排队,队列满了才招!口诀"核满排队、队满扩招、全满拒绝"。