线程池的7大参数
一、 corePoolSize 线程池核心线程大小
核心线程永远不会销毁,即使他们处于空闲状态,除非设置了allowCoreThreadTimeOut。任务提交到线程池后,首先会检查当前线程数是否达到了corePoolSize,如果没有达到的话,则会创建一个新线程来处理这个任务。(即使线程池中有空闲着的线程)
二、maximumPoolSize 线程池最大线程数量
当前线程数达到corePoolSize后,如果继续有任务被提交到线程池,会将任务缓存到工作队列(后面会介绍)中。如果队列也已满,则会去创建一个新线程来出来这个处理。线程池不会无限制的去创建新线程,它会有一个最大线程数量的限制,这个数量即由maximunPoolSize指定。
三、keepAliveTime 空闲线程存活时间
空闲线程(临时工,无论是不是空闲都被称为空闲线程)
空闲线程在空闲了指定时间后,空闲线程会被销毁,这里的指定时间由keepAliveTime来设定
四、unit 空闲线程存活时间单位
keepAliveTime的计量单位
五、workQueue 工作队列
新任务被提交后,会先进入到此工作队列中,任务调度时再从队列中取出任务。
六、threadFactory 线程工厂
创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等等
七、handler 拒绝策略
自定义线程池的参数创建线程池
往线程池中添加任务的过程
核心线程:核心线程永远不会销毁,即使他们处于空闲状态
工作队列:核心线程都在忙时,先把任务存到工作队列中,这时核心线程努力一下还能处理过来。
空闲线程(临时工):核心线程都在处理任务,缓存队列也被存满了,说明任务真的太多处理不过来了,这时创建空闲线程。(临时工)
1.当线程池中的线程数量<核心线程数量时,每添加一个任务,就会创建一个新的线程执行这个任务(不论线程池中的线程是否处于空闲状态)
2.当线程池中的线程数量=核心线程数量时(线程池无空闲),每添加一个任务就把这个任务放入缓存队列。
3.当线程池中线程数量>=核心线程数量,并且缓存队列也被存满时,再添加的任务,会创建空闲线程(临时工)来处理新任务。
4.当线程池中线程数量=最大线程数量,并且缓存队列也被存满时,再添加任务会触发拒绝策略。
空闲线程回收:当线程池中线程数量>核心线程数量,并且某一条空闲线程的空闲时间超过一定时间,就会把这条线程当做临时线程回收。