并发 · 主观题 · 第 23 题
Java 后端开发面试 · 第 23 题
线程池有哪些核心参数?有哪些拒绝策略?线程数一般怎么设置?
参考答案
1. 七个参数:corePoolSize 核心线程数、maximumPoolSize 最大线程数、keepAliveTime 和 unit(非核心线程的空闲存活时间)、workQueue 工作队列、threadFactory(给线程命名,便于排查问题)、handler 拒绝策略。
2. 提交流程:核心线程 → 队列 → 非核心线程 → 拒绝。
3. 四种拒绝策略:AbortPolicy 抛异常(默认);CallerRunsPolicy 由提交任务的线程自己执行,起到反压作用;DiscardPolicy 静默丢弃;DiscardOldestPolicy 丢弃队列里最老的任务后重试提交。
4. 线程数估算:CPU 密集型约为 CPU 核数 + 1;IO 密集型约为 核数 × (1 + 等待时间 / 计算时间);最终以压测结果为准,最好支持动态调整。
5. 规范:不要用 Executors 的默认工厂方法(无界队列或无界线程数可能导致 OOM),手动 new ThreadPoolExecutor 并使用有界队列;做好监控(活跃线程数、队列长度、拒绝次数)。
解析
参数、流程、拒绝策略、线程数估算是四个得分点。