Executors 三种自带线程池

Executor 框架最核心的类是 ThreadPoolExecutor,它是线程池的实现类,其构造器参数如下:

  • corePoolSize:核心线程池的大小,线程数小于等于核心数时,即便线程空闲,也不会终止(除非设置了allowCoreThreadTimeOut
  • maximumPoolSize:最大线程池大小
  • keepAliveTimeunit:保活时间和保活时间的单位,当线程数超过核心数时,线程空闲时间超过保活时间就会被终止
  • BlockingQueue:用来暂时保存任务的工作队列,存在无界队列(如:LinkedBlockingQueue)和有界队列(如:ArrayBlockingQueue),如果用无界队列,线程数就永远都不会超过核心数,那么maximumPoolSizekeepAliveTimeRejectedExecutionHandler就都没意义了
  • ThreadFactory:线程工厂,可以在创建每个线程时设置更有意义的名字
  • RejectedExecutionHandler:饱和策略,当线程池满了,需要一种策略来处理提交的新任务。默认为AbortPolicy

Executor 框架内包含一个 Executors 工具类,可以用于创建几种常用的线程池:

  • FixedThreadPool
  • SingleThreadPool
  • CachedThreadPool

FixedThreadPool

固定线程数的线程池

参数:

  • corePoolSize:自定义
  • maximumPoolSize:等于 corePoolSize
  • keepAliveTime: 0s
  • BlockingQueueLinkedBlockingQueue
  • ThreadFactory:自定义
  • RejectedExecutionHandlerAbortPolicy

特点:

  • 使用 LinkedBlockingQueue 这个无界队列作为工作队列,所以只有 corePoolSizeThreadFactory 两个参数有效。

SingleThreadPool

只有一个线程的线程池

参数:

  • corePoolSize:1
  • maximumPoolSize:1
  • keepAliveTime: 0s
  • BlockingQueueLinkedBlockingQueue
  • ThreadFactory:自定义
  • RejectedExecutionHandlerAbortPolicy

特点:

  • corePoolSize 固定为 1,也是使用 LinkedBlockingQueue 作为工作队列,所以只有 ThreadFactory 一个参数有效

CachedThreadPool

会根据需要创建新线程的线程池,核心线程数为 0,最大线程数为 Integer.MAX_VALUE

参数:

  • corePoolSize:0
  • maximumPoolSizeInteger.MAX_VALUE
  • keepAliveTime: 60s
  • BlockingQueueSynchronousQueue
  • ThreadFactory:自定义
  • RejectedExecutionHandlerAbortPolicy

特点:

  • corePoolSize 为 0,最大线程数相当于无限,工作队列使用没有容量的 SynchronousQueue
  • 如果提交任务的速度高于线程处理任务的速度,线程池会不断地创建新线程
  • 保活时间固定为 60s