Java面试题更新 2026-08-03

面对 1000 个任务、单个任务耗时 0.1s 且要求最大响应时间 1s 的场景,应如何配置线程池的核心参数?

考察说明

考查候选人依据任务量与响应时间约束,估算并配置线程池参数的能力。

回答思路

  1. 【回答框架 1】先计算理论线程数:若任务为 CPU 密集,线程数接近 Ncpu;若为 IO 密集,按 Ncpu×(1+W/C) 估算。此处单任务 0.1s,若为 IO 等待,可先取 Ncpu 的若干倍。
  2. 【回答框架 2】再按响应时间反推:总任务 1000,要求 1s 内完成,则吞吐需至少 1000 任务/秒,每个线程每秒可处理 10 个任务,故至少需 100 个线程。但实际需考虑队列与线程创建开销。
  3. 【回答框架 3】设置核心线程数(如 100)、最大线程数(如 200)与有界队列(如 2000)。当任务数超过核心线程+队列容量时,才创建新线程至最大线程数,并采用合适的拒绝策略(如 CallerRunsPolicy)。
  4. 【回答框架 4】最终需压测验证:理论值仅为起点,实际受 CPU 核数、内存、锁竞争影响,应通过压测调整参数,并监控线程池活跃度与任务排队时间。
  5. 【关键点 1】理论最小线程数约为 100,即 1000 任务/1s 除以每线程每秒处理 10 个任务。
  6. 【关键点 2】核心线程数可设为 100,最大线程数设为 200,队列容量设为 2000,以吸收突发任务。
  7. 【关键点 3】拒绝策略建议使用 CallerRunsPolicy,避免任务丢弃。
  8. 【关键点 4】最终参数需通过压测与监控调整,不能仅依赖理论计算。
  9. 【易错点 1】将线程数直接设为 1000 或更大,可能导致上下文切换开销过大。
  10. 【易错点 2】忽略队列容量,导致大量任务直接触发拒绝策略。
  11. 【易错点 3】未区分 CPU 密集与 IO 密集,错误使用公式。