§2.2.4 线程池核心参数与执行流程
考察意图:能否根据业务场景做线程池选型与调参,理解拒绝策略的差异。
回答样板:
七个核心参数:
corePoolSize——常驻线程数maximumPoolSize——最大线程数keepAliveTime——空闲线程存活时间(超过corePoolSize的线程)TimeUnit——时间单位workQueue——阻塞队列(有界/无界)threadFactory——线程工厂(自定义线程名、是否守护线程等)handler——拒绝策略
执行流程: 提交任务 → 当前线程数 < corePoolSize → 创建核心线程执行 → 当前线程数 >= corePoolSize → 入队列等待 → 队列满 → 创建非核心线程执行 → 当前线程数 >= maximumPoolSize → 触发拒绝策略
四种拒绝策略:
| 策略 | 行为 | 适用场景 |
|---|---|---|
| AbortPolicy(默认) | 抛RejectedExecutionException | 必须感知任务丢失的场景 |
| CallerRunsPolicy | 调用者线程执行 | 反向压制动,降低任务提交速度 |
| DiscardPolicy | 直接丢弃,静默失败 | 不重要的日志/统计任务 |
| DiscardOldestPolicy | 丢弃队列最老的未处理任务 | 优先处理新任务的场景 |
项目实战:在物联平台用线程池处理设备数据批量写入。I/O密集型任务核心线程数设为CPU核数×2,队列用有界ArrayBlockingQueue防止内存溢出。自定义ThreadFactory设置线程名前缀方便排查。拒绝策略用CallerRunsPolicy做背压。
陷阱提示:背参数但说不清业务场景下怎么选型和调参。