1.线程池的7大参数
(1)corePoolSize(库er普赛日):线程池中的常驻核心线程数。
(2)maximum(纳科斯码)PoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1。
(3)keepAliveTime(kei普额赖太木):多余的空闲线程存活时间,当空间时间达到keepAliveTime值时,多余的线程会被销毁直到只剩下corePoolSize个线程为止。
(4)unit(u耐特):keepAliveTime的单位。
(5)workQueue(我科Q):任务队列,被提交但尚未被执行的任务。
(6)threadFactory(特ruai的fai科特瑞):表示生成线程池中工作线程的线程工厂,用户创建新线程,一般用默认即可。
(7)handler(憨播瑞):拒绝策略,表示当线程队列满了并且工作线程大于等于线程池的最大显示数(maxnumPoolSize)时如何来拒绝请求执行的runnable的策略。
2.线程池的五种状态
- RUNNING (玩累):能接受新提交的任务,并且也能处理阻塞队列中的任务;
- SHUTDOWN(小特当) :关闭状态,不再接受新提交的任务,但却可以继续处理阻塞队列中已保存的任务。在线程池处于 RUNNING 状态时,调用 shutdown ()方法会使线程池进入到该状态。(finalize () 方法在执行过程中也会调用shutdown ()方法进入该状态);
- STOP :不能接受新任务,也不处理队列中的任务,会中断正在处理任务的线程。在线程池处于 RUNNING 或 SHUTDOWN 状态时,调用
- TIDYING:当所有的任务已终止,ctl记录的”任务数量”为0,线程池会变为TIDYING状态。当线程池变为TIDYING状态时,会执行钩子函数terminated()。terminated()在ThreadPoolExecutor类中是空的,若用户想在线程池变为TIDYING时,进行相应的处理;可以通过重载terminated()函数来实现。
- TERMINATED (特美内te):在terminated () 方法执行完后进入该状态,默认terminated ()方法中什么也没有做。
1.LinkedBlocking(步咯ging)Queue
3.线程池的阻塞队列
第一种阻塞队列是 LinkedBlockingQueue,它的容量是 Integer.MAX_VALUE,为 231 -1 ,是一个非常大的值,可以认为是无界队列。
FixedThreadPool 和 SingleThreadExecutor 线程池的线程数是固定的,所以没有办法增加特别多的线程来处理任务,这时就需要 LinkedBlockingQueue 这样一个没有容量限制的阻塞队列来存放任务。
2.Synchronous(深工耐斯)Queue
第二种阻塞队列是 SynchronousQueue,对应的线程池是 CachedThreadPool。线程池 CachedThreadPool 的最大线程数是 Integer.MAX_VALUE,可以理解为线程数是可以无限扩展的。
CachedThreadPool 和上一种线程池 FixedThreadPool 的情况恰恰相反,FixedThreadPool 的情况是阻塞队列的容量是无限的,而这里 CachedThreadPool 是线程数可以无限扩展,所以 CachedThreadPool 线程池并不需要一个任务队列来存储任务,因为一旦有任务被提交就直接转发给线程或者创建新线程来执行,而不需要另外保存它们。
我们自己创建使用 SynchronousQueue 的线程池时,如果不希望任务被拒绝,那么就需要注意设置最大线程数要尽可能大一些,以免发生任务数大于最大线程数时,没办法把任务放到队列中也没有足够线程来执行任务的情况。
3.Delayed(得嘞)WorkQueue
第三种阻塞队列是DelayedWorkQueue,它对应的线程池分别是 ScheduledThreadPool 和 SingleThreadScheduledExecutor,这两种线程池的最大特点就是可以延迟执行任务,比如说一定时间后执行任务或是每隔一定的时间执行一次任务。
DelayedWorkQueue 的特点是内部元素并不是按照放入的时间排序,而是会按照延迟的时间长短对任务进行排序,内部采用的是“堆”的数据结构(堆的应用之一就是 优先级队列)。之所以线程池 ScheduledThreadPool 和 SingleThreadScheduledExecutor 选择 DelayedWorkQueue,是因为它们本身正是基于时间执行任务的,而延迟队列正好可以把任务按时间进行排序,方便任务的执行
4.线程池的拒绝策略
- Abort(额波尔特)Policy(坡喽c):为线程池默认的拒绝策略,该策略直接抛异常处理。
- Discard(滴死怪的)Policy:直接抛弃不处理。
- DiscardOldest(偶的爱思特)Policy:丢弃队列中最老的任务。
- Caller(考lei儿)Runs(润斯)Policy:将任务分配给当前执行execute方法线程来处理。