线程池核心参数与执行流程

§2.2.4 线程池核心参数与执行流程

考察意图:能否根据业务场景做线程池选型与调参,理解拒绝策略的差异。

回答样板

七个核心参数

  1. corePoolSize——常驻线程数
  2. maximumPoolSize——最大线程数
  3. keepAliveTime——空闲线程存活时间(超过corePoolSize的线程)
  4. TimeUnit——时间单位
  5. workQueue——阻塞队列(有界/无界)
  6. threadFactory——线程工厂(自定义线程名、是否守护线程等)
  7. handler——拒绝策略

执行流程: 提交任务 → 当前线程数 < corePoolSize → 创建核心线程执行 → 当前线程数 >= corePoolSize → 入队列等待 → 队列满 → 创建非核心线程执行 → 当前线程数 >= maximumPoolSize → 触发拒绝策略

四种拒绝策略

策略行为适用场景
AbortPolicy(默认)抛RejectedExecutionException必须感知任务丢失的场景
CallerRunsPolicy调用者线程执行反向压制动,降低任务提交速度
DiscardPolicy直接丢弃,静默失败不重要的日志/统计任务
DiscardOldestPolicy丢弃队列最老的未处理任务优先处理新任务的场景

项目实战:在物联平台用线程池处理设备数据批量写入。I/O密集型任务核心线程数设为CPU核数×2,队列用有界ArrayBlockingQueue防止内存溢出。自定义ThreadFactory设置线程名前缀方便排查。拒绝策略用CallerRunsPolicy做背压。

陷阱提示:背参数但说不清业务场景下怎么选型和调参。

本作品采用 CC BY-NC-SA 4.0 协议进行许可
使用 Hugo 构建
主题 StackJimmy 设计