主题
面试速答(先看这里)
**一句话结论:**核心线程会一直存在(即使空闲),除非设置了 allowCoreThreadTimeOut(true) 。
60秒标准回答:
这个问题其实在上面的文章中介绍过,但是我发现最近问这个还挺多的, 有的时候搜索不一定能找到准确的内容,所以单独写一篇,详细展开再介绍下
以下这个是Java中ThreadPoolExecutor的构造函数,那么看他都有哪些参数就行了
corePoolSize
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**这个问题其实在上面的文章中介绍过,但是我发现最近问这个还挺多的, 有的时候搜索不一定能找到准确的内容,所以单独写一篇,详细展开再介绍下。
- **要点2:**以下这个是Java中ThreadPoolExecutor的构造函数,那么看他都有哪些参数就行了。
- **要点3:**线程池中允许存在的最大线程数。
- **要点4:**存放等待执行任务的队列。
- **要点5:**超过核心线程数的空闲线程,超过该时间后会被销毁。
**记忆锚点:**keepAliveTime → 核心线程 → OOM → allowCoreThreadTimeOut → PriorityBlockingQueue → LinkedBlockingQueue
关键取舍:
- ArrayBlockingQueue 可限制任务数量,防止 OOM,推荐使用。
易错提醒:
- 核心线程数&最大线程数 LinkedBlockingQueue 无界链表队列(默认容量 Integer.MAX_VALUE 常用于执行大量任务,容易导致 OOM。
加分表达:
- corePoolSize 核心线程会一直存在(即使空闲),除非设置了 allowCoreThreadTimeOut(true) 。
- 当任务到来时,线程池先创建核心线程来执行任务。
- 任务太多且队列已满时,会创建非核心线程,直到达到此上限。
追问准备:
- 围绕「keepAliveTime」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「核心线程」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「OOM」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
这个问题其实在上面的文章中介绍过,但是我发现最近问这个还挺多的, 有的时候搜索不一定能找到准确的内容,所以单独写一篇,详细展开再介绍下。
以下这个是Java中ThreadPoolExecutor的构造函数,那么看他都有哪些参数就行了。

| 参数 | 含义 | 说明 |
|---|---|---|
corePoolSize | 核心线程数 | 核心线程会一直存在(即使空闲),除非设置了 allowCoreThreadTimeOut(true)。当任务到来时,线程池先创建核心线程来执行任务。 可以类比正式员工数量,常驻。 |
maximumPoolSize | 最大线程数 | 线程池中允许存在的最大线程数。任务太多且队列已满时,会创建非核心线程,直到达到此上限。 公司最多雇佣员工数量。 |
workQueue | 任务队列 | 存放等待执行任务的队列。不同类型的队列影响线程池的行为。 再多的人都处理不过来了,需要等着,在这个地方等。 |
keepAliveTime | 非核心线程存活时间 | 超过核心线程数的空闲线程,超过该时间后会被销毁。 就是外包人员等了多久,如果还没有活干,解雇了。 |
unit | 时间单位 | TimeUnit.SECONDS, MILLISECONDS等,表示 keepAliveTime的单位。 |
threadFactory | 线程工厂 | 用于创建线程,一般用于给线程命名或设置为守护线程。 |
handler | 拒绝策略 | 当任务太多无法处理时的处理方式(如抛异常、丢弃、调用者执行等)。 |
线程池创建方法
核心线程数&最大线程数
拒绝策略
任务队列类型
| 队列类型 | 说明 | 特点 |
|---|---|---|
LinkedBlockingQueue | 无界链表队列(默认容量 Integer.MAX_VALUE ) | 常用于执行大量任务,容易导致 OOM。 |
ArrayBlockingQueue | 有界数组队列 | 可限制任务数量,防止 OOM,推荐使用。 |
SynchronousQueue | 不存储任务的“直接移交”队列 | 每个插入操作必须等待对应的取出操作。用于“任务即时执行”。 |
PriorityBlockingQueue | 优先级队列 | 根据任务优先级执行。 |