面试官:线程池里有什么? 各自的作用是什么?
典型的线程池包括:
newSingleThreadExecutor
newFixedThreadExecutor
newCacheThreadExecutor
newScheduleThreadExecutor
1、newSingleThreadExecutor :
一个线程的线程池,即线程池中一次只能有一个线程运行,而单个线程串行执行任务
2、newFixedThreadExecutor :
每次提交任务时都是线程,直到线程达到线程池的最大数量。 然后,它将排队等待线程达到线程池的最大数量,并继续上一个任务。
3、newCacheThreadExecutor :
可缓存的线程池。 如果线程池的大小超过了处理任务所需的线程,则回收部分空闲线程(通常不运行60秒),如果有任务,则添加新线程并运行。
4、newScheduleThreadExecutor :
大小不限的线程池。 支持调度和周期性执行线程。
ThreadPoolExecutor解说:
ThreadPoolExecutor是上面几个线程池的基础实现,它封装了线程类工作器层,在运行时运行自己的线程,然后自行排队并卸下下下一个线程来运行。
其中完整的结构方法如下
publicthreadpoolexecutor (intcorepoolsize,intmaximumPoolSize,longkeepAliveTime,
时间单元单元,
BlockingQueueworkQueue、
热故障诊断,
rejectedexecutionhandlerhandler (if (公司化0 )=0) this.corePoolSize=corePoolSize; this.maximumpoolsize=maximumpoolsize; this.workQueue=workQueue; this.keepalive time=unit.to nanos (keepalive time ); this.threadfactory=threadfactory; this.handler=handler;
}
corePoolSize :线程池中存储的线程数。 包括空闲线程;
maximumPoolSize :线程池中允许的最大线程数;
关键时间:线程的生存时间。 如果超过keepAliveTime时无法获取新任务,则返回null;
单元: keepalive time参数的时间单位;
工作队列:用于保留运行前任务的队列,该任务只保留由执行方法发送的Runnable任务;
threadFactory :运行程序创建新线程时使用的工厂;
处理程序:使用阻止时使用的处理策略,因为超出了线程范围和队列容量;
拒绝策略RejectedExecutionHandler有哪些,每个都有哪些角色?
AbortPolicy:此策略是线程池的默认策略; 如果线程池团队已满并放弃此任务,并且抛出了RejectedExecutionException异常。
DiscardPolicy :当线程池团队已满时,将直接放弃此任务,无一例外。
DiscarOldestPolicy :队列已满时,尝试删除第一个进入队列的任务,留出空间,然后加入队列。
CallRunsPolicy :如果添加到线程池失败,则主线程会自己执行任务,而不会等待线程池中的线程执行。
自定义策略