线程池的七大参数:
corePoolSize 核心线程数
maximumPoolSize 最大线程数
keepAliveTime 空闲线程存活时间
unit keepAliveTime的时间单位
workQueue 任务队列
threadFactory 线程工厂,用于创建线程
handler 拒绝策略 -4种
默认拒绝策略 : 直接抛异常
2--> 直接丢弃
3--> 丢弃队列中最旧的未处理任务
4-->调用者线程直接执行该任务
线程创建顺序 : 先创建核心线程数 ,满了之后 ,再来的线程进入workQueue ,如果workQueue也满了,就在外面排队(创建非核心线程) ,
但是排队数量不能超过 最大线程数-核心线程数
线程池的执行原理 :
ThreadPoolExecutor继承自Executor接口 ,实现execute方法
线程池的5中状态 :
RUNNING: 能够接收新任务,以及对已添加的任务进行处理。
SHUTDOWN : 不接收新任务,但能处理已添加的任务
STOP: 不接收新任务,不处理已添加的任务,并且会中断正在处理的任务
TIDYING:所有的任务已终止
TERMINATED:线程池彻底终止
execute()方法提交线程没有返回值 , submit() ,任务执行完成后有返回值
进入execute方法 , ctl.get();判断runState和workerCount ,
如果当前工作线程<核心线程数,则创建新的线程并且提交任务,
如果workerCount >corePoolSize ,且阻塞队列未满 ,则将任务添加到队列中
如果队列已满 ,且工作线程<最大线程数,则创建新的线程并提交任务,启动
添加工作线程需要调用addWorker()方法
线程池中的每一个线程被封装成一个Worker对象
addWorker中调用new Worker( Runnable firstTask) ,传入当前任务 , 内部实现为 :赋值当前任务,并调用ThreadFactory创建线程
而Worker本身继承了Runnable接口,所以Worker对象创建的过程中会调用work类中的run方法 ,也就是调用runWorker
runWorker中执行流程是:
while循环不断地通过getTask()方法获取任务 ,从阻塞队列中获取
获取到任务后开始执行 task.run()
如果没获取到 ,终止while循环 ,执行执行processWorkerExit()方法 这个方法会remove一个工作线程