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