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