Skip to content

面试速答(先看这里)

**一句话结论:**核心线程会一直存在(即使空闲),除非设置了 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拒绝策略当任务太多无法处理时的处理方式(如抛异常、丢弃、调用者执行等)。

线程池创建方法 ​

📄 ✅为什么不建议通过Executors构建线程池

打开文档:✅为什么不建议通过Executors构建线程池

核心线程数&最大线程数 ​

📄 ✅线程数设定成多少更合适?

打开文档:✅线程数设定成多少更合适?

拒绝策略 ​

📄 ✅线程池的拒绝策略有哪些?

打开文档:✅线程池的拒绝策略有哪些?

任务队列类型 ​

队列类型说明特点
LinkedBlockingQueue无界链表队列(默认容量 Integer.MAX_VALUE )常用于执行大量任务,容易导致 OOM。
ArrayBlockingQueue有界数组队列可限制任务数量,防止 OOM,推荐使用。
SynchronousQueue不存储任务的“直接移交”队列每个插入操作必须等待对应的取出操作。用于“任务即时执行”。
PriorityBlockingQueue优先级队列根据任务优先级执行。

线程池调优 ​

📄 ✅如何进行线程池调优?

打开文档:✅如何进行线程池调优?