Executor
框架最核心的类是 ThreadPoolExecutor
,它是线程池的实现类,其构造器参数如下:
- corePoolSize:核心线程池的大小,线程数小于等于核心数时,即便线程空闲,也不会终止(除非设置了allowCoreThreadTimeOut)
- maximumPoolSize:最大线程池大小
- keepAliveTime 和 unit:保活时间和保活时间的单位,当线程数超过核心数时,线程空闲时间超过保活时间就会被终止
- BlockingQueue:用来暂时保存任务的工作队列,存在无界队列(如:LinkedBlockingQueue)和有界队列(如:ArrayBlockingQueue),如果用无界队列,线程数就永远都不会超过核心数,那么maximumPoolSize、keepAliveTime和RejectedExecutionHandler就都没意义了
- ThreadFactory:线程工厂,可以在创建每个线程时设置更有意义的名字
- RejectedExecutionHandler:饱和策略,当线程池满了,需要一种策略来处理提交的新任务。默认为AbortPolicy
Executor
框架内包含一个 Executors
工具类,可以用于创建几种常用的线程池:
- FixedThreadPool
- SingleThreadPool
- CachedThreadPool
FixedThreadPool
固定线程数的线程池
参数:
- corePoolSize:自定义
- maximumPoolSize:等于 corePoolSize
- keepAliveTime: 0s
- BlockingQueue:LinkedBlockingQueue
- ThreadFactory:自定义
- RejectedExecutionHandler:AbortPolicy
特点:
- 使用 LinkedBlockingQueue 这个无界队列作为工作队列,所以只有 corePoolSize 和 ThreadFactory 两个参数有效。
SingleThreadPool
只有一个线程的线程池
参数:
- corePoolSize:1
- maximumPoolSize:1
- keepAliveTime: 0s
- BlockingQueue:LinkedBlockingQueue
- ThreadFactory:自定义
- RejectedExecutionHandler:AbortPolicy
特点:
- corePoolSize 固定为 1,也是使用 LinkedBlockingQueue 作为工作队列,所以只有 ThreadFactory 一个参数有效
CachedThreadPool
会根据需要创建新线程的线程池,核心线程数为 0,最大线程数为 Integer.MAX_VALUE
。
参数:
- corePoolSize:0
- maximumPoolSize:Integer.MAX_VALUE
- keepAliveTime: 60s
- BlockingQueue:SynchronousQueue
- ThreadFactory:自定义
- RejectedExecutionHandler:AbortPolicy
特点:
- corePoolSize 为 0,最大线程数相当于无限,工作队列使用没有容量的 SynchronousQueue
- 如果提交任务的速度高于线程处理任务的速度,线程池会不断地创建新线程
- 保活时间固定为 60s