ThreadPoolExecutor参数工作方式

ThreadPoolExecutor参数工作方式

corePoolSize 线程池中核心线程数的最大值

maximumPoolSize 线程池中能拥有最多线程数

keepAliveTime 表示空闲线程的存活时间

TimeUnitunit 表示keepAliveTime的单位

workQueue 用于缓存任务的阻塞队列

  1. ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
  2. LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列
  3. SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。
  4. PriorityBlockingQueue:一个具有优先级的无限阻塞队列。

handler 表示当workQueue已满,且池中的线程数达到maximumPoolSize时,线程池拒绝添加新任务时采取的策略。(拒绝策略)

查看线程数的方法
ThreadPoolExecutor.getQueue().size()
ThreadPoolExecutor.getActiveCount()

线程池的工作方式

  1. 如果运行的线程少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队。(少于核心线程数,直接执行)
  2. 如果运行的线程等于或多于 corePoolSize,首选将请求加入队列,而不添加新的线程。
  3. 如果无法将请求加入队列(队列已满),则增加核心线程数到maximumPoolSize,若核心线程数超出 maximumPoolSize,在这种情况下,新的任务将被拒绝。