面试中问,java 线程池,工作中用也就几种,现在我们用一个餐厅比喻,轻松记住线程池的核心概念。
🍽️ 餐厅 = 线程池
想象你开了一家餐厅:
- 顾客点的菜 = 要执行的任务(
Runnable或Callable) - 厨师/服务员 = 线程(Thread)
- 后厨工作站数量 = 核心线程数(
corePoolSize) - 最大可临时招人的数量 = 最大线程数(
maximumPoolSize) - 等餐区(排队区) = 任务队列(
workQueue) - 厨师空闲太久被辞退 = 空闲线程超时(
keepAliveTime) - 招不到人、队伍太长时的应对策略 = 拒绝策略(
RejectedExecutionHandler)
🧠 线程池怎么工作?
-
餐厅正常营业时(任务到来):
- 如果当前服务员 ≤ 核心人数(比如 3 个),立马招人,哪怕有空位也先干活。
- 如果已有 3 个服务员在忙,新任务就先排队等位(放进任务队列)。
- 如果队列也满了,就临时加人,直到达到最大服务员数(比如 10 个)。
- 如果连临时工都招满了(10 人),新来的顾客就会被拒绝入内(触发拒绝策略)。
-
客流减少后:
- 超过核心人数的临时服务员,如果空闲超过
keepAliveTime(比如 1 分钟),就会被辞退,节省成本。
- 超过核心人数的临时服务员,如果空闲超过
🛠️ Java 中怎么创建线程池?
虽然你可以用 ThreadPoolExecutor 手动配置(就像自己设计餐厅规则),但 Java 提供了 4 种“套餐”:
| 套餐 | 方法 | 特点 | 适合场景 |
|---|---|---|---|
| 固定人数餐厅 | Executors.newFixedThreadPool(n) | 固定 n 个服务员,队列无限长 | 任务量稳定、长期运行 |
| 来一个招一个 | Executors.newCachedThreadPool() | 服务员按需创建,空闲60秒就走 | 短时、突发性任务 |
| 单人小店 | Executors.newSingleThreadExecutor() | 只有 1 个服务员,任务顺序执行 | 需要串行执行的任务 |
| 定时打烊餐厅 | Executors.newScheduledThreadPool(n) | 支持定时或周期性任务 | 定时任务(如每天备份) |
⚠️ 注意:阿里巴巴《Java开发手册》建议不要直接用
Executors,因为:
FixedThreadPool使用无界队列,可能 OOM;CachedThreadPool线程数无上限,可能耗尽资源。
推荐手动创建ThreadPoolExecutor,明确设置参数!
✅ 一句话记住线程池
“先用核心线程干,干不完就排队,队列满了再扩招,实在不行就拒绝。”
💡 小贴士
- 核心线程数通常设为
CPU 核数 + 1(适用于计算密集型)或更高(适用于 IO 密集型)。 - 任务队列推荐用有界队列(如
ArrayBlockingQueue),避免内存爆炸。 - 拒绝策略可自定义,比如记录日志、降级处理等。
结语
线程池不是魔法,而是一种资源调度的艺术。理解它,就像理解如何高效运营一家餐厅——不多招人浪费钱,也不让顾客等太久。掌握这个比喻,下次面试或开发时,你就能轻松说出线程池的精髓!
🍀 记住:好的程序员,不光写代码,更懂得“省着用”资源。
889



被折叠的 条评论
为什么被折叠?



