类图

Executor.png

几种线程池

  1. 普通线程池
  2. 定时线程池

线程池构造参数

  1. corePoolSize: 池中所保存的线程数,包括空闲线程
  2. maximumPoolSize:池中允许的最大线程数
  3. keepAliveTime:当线程数大于核心时,此为终止前多余空闲线程等待新任务的最长时间
  4. unit:keepAliveTime的时间单位
  5. workQueue:执行前用于保持任务队列
  6. threadFactory:执行程序创建新线程是所使用工厂
  7. handler:超出线程容量和队列容量的处理类

线程池运行思路

  1. 当前池poolSize小于corePoolSize,创建新线程执行任务
  2. 当前池poolSize大于corePoolSize,且队列未满时,则进入等待队列
  3. 当前池poolSize大于corePoolSize且小于maximumPoolSize,且等待队列已满时,则创建新线程执行任务
  4. 当前池poolSize大于corePoolSize且大于maximumPoolSize,且等待队列已满时,则调用拒绝护理器处理

线程池里的每个线程执行 完任务后不会立刻退出,而是会检查下等待队列是否还有任务需要执行,如果在keepAliveTime里等不到新任务,那么退出

拒绝策略

  1. ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
  2. ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃。
  3. ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。
  4. ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务