请说明线程池的核心配置参数有哪些,并解释在你们的项目中为什么选择 IO 密集型线程池的配置方案。
考察说明
考查对线程池参数的理解以及根据任务类型(IO密集型)选择线程池配置的实战判断。
回答思路
- 【回答框架 1】核心参数包括 corePoolSize、maximumPoolSize、keepAliveTime、workQueue、threadFactory 和拒绝策略(如 AbortPolicy)。corePoolSize 是常驻线程数,maximumPoolSize 是最大线程数,keepAliveTime 是非核心线程空闲存活时间,workQueue 存放等待执行的任务。
- 【回答框架 2】任务提交时先使用核心线程,核心线程满则放入工作队列,队列满再创建非核心线程直至 maximumPoolSize,再满则触发拒绝策略。队列策略(有界/无界/同步移交)直接影响线程创建时机。
- 【回答框架 3】IO 密集型任务的特点是等待 IO 期间线程阻塞,CPU 利用率低。常用估算公式为 Ncpu × (1 + W/C),其中 W/C 是等待时间与计算时间之比,但该公式只能作为初始估算,最终应结合压测调整。
- 【回答框架 4】在我的项目中,[实际方案]通常将 corePoolSize 设为略大于 CPU 核数(如 2 倍),maximumPoolSize 适度放大,workQueue 设置为有界队列,以避免任务堆积导致内存压力。同时设置合理的拒绝策略和处理超时,以保证系统稳定。
- 【关键点 1】线程池参数包括核心线程数、最大线程数、空闲存活时间、工作队列、线程工厂和拒绝策略。
- 【关键点 2】任务执行顺序:核心线程 -> 工作队列 -> 非核心线程 -> 拒绝策略。
- 【关键点 3】IO 密集型场景应适当提高线程数以利用等待时间,公式 Ncpu × (1 + W/C) 仅作初值。
- 【关键点 4】有界队列可防止任务无限堆积,需配合拒绝策略。
- 【易错点 1】误认为线程数越多越好,忽略线程切换开销和系统资源限制。
- 【易错点 2】使用无界队列可能导致内存溢出。
- 【易错点 3】将公式计算结果当作固定结论,不进行压测验证。