线程池的核心参数以及常用线程池的种类
- 引言
- 7大核心参数
- int corePoolSize 核心线程最大数量
- int maximumPoolSize 线程总数量最大值
- long keepAliveTime 非核心线程的闲置超时时间
- TimeUnit unit (keepAliveTime的单位)
- BlockingQueue workQueue 阻塞队列
- ThreadFactory threadFactory 线程工厂
- RejectedExecutionHandler handler 拒绝策略
- 常用的四种线程池
- newCachedThreadPool (可缓存线程池)
- newFixedThreadPool(指定工作线程数量的线程池)
- newSingleThreadPool(单线程化的线程池)
- newScheduledThreadPool(定长线程池)
引言
我们通过线程池可以实现已创建线程的复用,减少资源的消耗;控制并发的数量;以及对线程进行统一的管理。
下面我会对线程池的核心参数以及常用的线程池种类进行详细的讲解。
7大核心参数
int corePoolSize 核心线程最大数量
核心线程:线程池中有两类线程:核心线程和非核心线程。核心线程默认情况下会一直存在于线程池中,即使这个核心线程什么都不干,而非核心线程如果长时间的闲置,就会被销毁。
int maximumPoolSize 线程总数量最大值
改值等于核心线程数+非核心线程数
long keepAliveTime 非核心线程的闲置超时时间
非核心线程闲置时间超过此值就会被销毁
TimeUnit unit (keepAliveTime的单位)
TimeUnit是一个枚举类型:
NANOSECONDS : 1微毫秒,
MICROSECONDS:1微秒
MILLSECONDS:1毫秒
SECONDS:1秒
MINUTES:1分
HOURS:1小时
DAYS:1天
BlockingQueue workQueue 阻塞队列
常见的几个阻塞队列:
- LinkedBlockingQueue
链式阻塞队列,默认大小:Interger.MAX_VALUE,可以指定大小。 - ArrayBlockingQueue
数组阻塞队列,需要指定大小 - SynchronousQueue
同步队列,内部容量为0,每个put操作都必须等待一个take操作。反之亦然 - DelayQueue
延迟队列,队列中的元素之后当其指定的延迟时间到了,才能从队列中获取到改元素。
ThreadFactory threadFactory 线程工厂
创建线程的工厂,用于批量创建线程,如果不指定,会新建一个默认的线程工厂。
RejectedExecutionHandler handler 拒绝策略
拒绝处理策略,当无法创建新线程处理任务并且阻塞队列已满时就会采用拒绝处理策略。
jdk默认四种策略:
- ThreadPoolExecutor.AbortPolicy:默认拒绝处理策略,丢弃任务并抛出异常
- ThreadPollExecutor.DiscardPolicy:丢弃新来的任务,但不抛出异常
- ThreadPollExecutor.DiscardOldestPolicy:丢弃阻塞队列头部(最旧)的任务,然后重新尝试执行程序,(如果再次失败,重复此过程)
- ThreadPollExecutor.CallerRunPolicy:由调用的线程去处理改任务。只适用于并发小的情况。
常用的四种线程池
newCachedThreadPool (可缓存线程池)
核心线程数为0,总线程数是最大整数,当需要执行很多短时任务时它的服用率比较高,会显著提升性能。并且线程空闲60s就会被回收,所以如果没有任务,它并不会占用很多资源。
newFixedThreadPool(指定工作线程数量的线程池)
核心线程数等于最大线程数。也就是该线程池中没有非核心线程。
newSingleThreadPool(单线程化的线程池)
只有一个核心线程,所有任务按照先来先执行的顺序执行。
newScheduledThreadPool(定长线程池)
这个线程池指定了核心线程的数量,线程总数可以创建整数的最大数个。
该线程池支持定时以及周期性任务执行。