标准答案
- 核心线程数控制常态并发,队列保存暂时无法执行的任务,最大线程数限制扩展上限。
- 有界队列能让容量边界可见;无界队列可能使最大线程参数失去实际作用并积压内存。
- 拒绝策略应区分快速失败、调用方执行、丢弃低价值任务和转移持久化。
- 任务必须有超时、取消和异常处理,线程池关闭要区分平滑和立即停止。
题目解析
ThreadPoolExecutor 的行为由 corePoolSize、队列、maximumPoolSize 和拒绝策略共同决定。无界队列会让任务长期排队并使 maximumPoolSize 很难发挥作用,有界队列才能暴露过载边界。
线程数还要服从 CPU、阻塞时长、数据库连接和远端配额。拒绝时可以快速失败、调用方执行、丢弃低价值任务或转可靠存储,但必须让业务知道任务是否被接受。
任务异常、取消和关闭都要可观察。线程池“还有线程”不代表任务成功,至少要监控队列年龄、活跃数、拒绝率、异常和下游等待。
常见误区
- 误区:使用无界队列却调大 maximumPoolSize。改正:使用有界队列并按任务服务时间和下游容量共同配置。
- 误区:Executors 工厂创建无边界资源池用于生产。改正:显式声明队列、线程、命名、拒绝和关闭策略。
- 误区:任务异常被吞掉,线程池看似健康。改正:捕获并记录任务异常、结果和重试,监控执行失败而不是只看线程存活。