线程池的任务执行机制
任务调度
任务调度是线程池的主要入口(execute(Runnable r)),接下来任务如何执行都是有这个阶段决定的;
所有的任务调度都是有execute方法完成,检查现在线程池的运行状态,运行的线程数,运行策略,决定接下来执行的流程,是直接申请线程执行,还是缓冲到队列中执行,亦或是直接拒绝该任务;
执行过程如下:
1.首先检查线程池的运行状态,如果不是RUNNING,则直接拒绝,线程池要保证在RUNNING状态下执行任务
2.如果workCount < corePoolSize,则创建并启动一个线程来执行新提交的任务
3.如果workCount > corePoolSize 且线程池中阻塞队列未满,则任务添加到阻塞队列中
4.如果workCount > corePoolSize && workCount < maximumPoolSize 且线程池的阻塞队列已经满了,则创建并且启动一个线程来执行新的任务,
5.如果workCount > maximumPoolSize,并且线程池的队列已经满了,则根据拒绝策略来处理该任务;默认的方式是直接抛出异常
结合代码分析
只是把核心的代码写出来了
public void execute(Runnable command) {
int c = ctl.get();
// 判断当前线程数是否小于核心线程数 如果小于核心线程数 添加工作线程
//可能有小伙伴会有疑问?这不是首先判断线程池的状态?
//线程池的状态判断都是在addWorkder()方法中判断的;
if (workerCountOf(c) < corePoolSize) {
// 添加核心线程成功,结束;
if (addWorker(command, true))
return;
c = ctl.get();
}
//程序走到这一步 workCount >= corePoolSize;
// 线程是否正在运行,如果添加队列成功,说明队列没有满
// 如果添加队列失败说明,队列已经满了