后端岗位面试题更新 2026-08-05

请说明自定义线程池的创建方式,并解释如何确定核心线程数、最大线程数、队列容量、拒绝策略等参数。

后端开发性能优化技术原理方案权衡Java

考察说明

考察对线程池核心参数的理解及基于业务场景合理配置参数的能力。

回答思路

  1. 【回答框架 1】自定义线程池通常通过 ThreadPoolExecutor 的构造函数直接创建,核心参数包括 corePoolSize、maximumPoolSize、keepAliveTime、workQueue、threadFactory 和 handler。线程池的处理流程是:先创建核心线程,核心线程满后任务进入队列,队列满后再创建非核心线程直至最大线程数,仍无法处理则触发拒绝策略。
  2. 【回答框架 2】corePoolSize 通常根据任务类型估算:CPU 密集型任务可用 N+1 或 N,IO 密集型任务可用 2*N 或 N*(1+阻塞系数),其中 N 为 CPU 核数。这些只是初始估算,最终数值需结合压测调整。
  3. 【回答框架 3】maxPoolSize 与队列容量互相制约:如果队列容量较大,可能长时间不创建非核心线程;如果 maxPoolSize 较大,可能增加线程切换开销。拒绝策略可选择 AbortPolicy(默认,抛异常)、CallerRunsPolicy(调用者执行)、DiscardPolicy、DiscardOldestPolicy,需根据业务要求设定。
  4. 【回答框架 4】线程工厂建议设置自定义名称以方便排查日志;keepAliveTime 一般影响非核心线程的回收,可结合资源占用与响应速度考虑。实际生产环境还应通过压测验证,并监控队列长度、活跃线程数和拒绝次数。
  5. 【关键点 1】核心参数包括 corePoolSize、maximumPoolSize、keepAliveTime、workQueue、threadFactory、handler。
  6. 【关键点 2】任务处理流程:核心线程 -> 队列 -> 最大线程 -> 拒绝策略。
  7. 【关键点 3】参数设置需结合任务类型(CPU密集型、IO密集型)及阻塞比例,并通过压测调整。
  8. 【关键点 4】不同拒绝策略的适用场景不同,AbortPolicy 抛异常,CallerRunsPolicy 降低提交速度。
  9. 【易错点 1】不按业务场景直接套用公式,忽视阻塞比例和压测结果。
  10. 【易错点 2】将最大线程数设置过大,导致线程切换开销大于收益。
  11. 【易错点 3】忽略线程工厂命名,导致问题排查困难。