image.png

  • corePoolSize 核心线程数
    • 线程池在完成初始化后,默认情况下,线程池中并没有任何线程,线程池在等待有任务到来时,再去创建新线程去执行任务
  • maxPoolSize 最大线程数
    • 核心线程数的基础上,额外增加的线程数的上线

image.png

添加线程规则

  • 如果线程数小于 corePoolSize , 创建一个新线程来运行来运行新任务
  • 如果线程数等于或大于 corePoolSize 但小于 maximunPollSize 则任务放入队列
  • 如果队列已满, 并且线程数小于 maxPoolSize 创建一个新线程
  • 如果队列已满,线程数小于或等于 maxPoolSize 则拒绝

image.png

  • keepAliveTime
    • 如果线程池当前的线程数多余 corePoolSize name多余的线程空闲时间超过 keepAliveTime 会被终止
  • ThreadFactory 创建线程
    • 默认使用 Exccutors.defaultThreadFactory()
    • 创建出来的线程都在同一线程组中, 优先级都是5 都是守护线程
    • 自己指定 THreadFactory 就可以改变线程名,线程组,优先级, 是否守护线程
  • 工作队列 workQueue
    • 三种最常见的队列类型
      • 直接交换 SynchronousQueue
      • 无界队列 LinkedBlockingQueue
      • 有界队列 ArrayBlockingQueue
  • 应该手动还是自动创建
    • 手动最好, 可以更加明确线程池的运行规则,避免资源耗尽的风险
    • 自动创建
      • newFixedThreadPool 容易造成大量内存占用
      • newSingleThreadExecutor