线程池详解

概述

线程池是管理一组工作线程的机制,避免频繁创建销毁线程的开销。

核心参数

ThreadPoolExecutor七大参数

  • corePoolSize:核心线程数
  • maximumPoolSize:最大线程数
  • keepAliveTime:非核心线程空闲超时时间
  • unit:时间单位
  • workQueue:任务队列
  • threadFactory:线程工厂
  • handler:拒绝策略

工作流程

提交任务 → 核心线程数未满?→ 创建核心线程 → 队列未满? → 加入队列 → 线程数未满? → 创建非核心线程 → 执行拒绝策略

拒绝策略

  • AbortPolicy:抛出异常(默认)
  • CallerRunsPolicy:调用线程执行任务
  • DiscardPolicy:直接丢弃
  • DiscardOldestPolicy:丢弃最老任务,加入新任务

线程池大小选择

  • CPU密集型:线程数 = CPU核心数 + 1
  • IO密集型:线程数 = CPU核心数 × (1 + IO等待比)

常见问题

Q: 为什么先填满队列再创建非核心线程?
A: 减少线程数,降低线程切换开销和内存占用

Q: keepAliveTime的作用?
A: 非核心线程空闲超过该时间会被销毁

Q: 如何合理设置线程池大小?
A: 根据CPU密集和IO密集类型选择合适的线程数