线程池执行流程
2022-03-10 17:05:53 0 举报
线程池执行流程
作者其他创作
大纲/内容
当前运行状态>=SHUTDOWN并且 rs=SHUTDOWN并且队列不为空
return false;
while (task != null || (task = getTask()) != null)进入getTask()方法
executor.execute(new Thread());
获取当前执行状态 < SHUTDOWN 即RUNNING状态,把w放入公共属性workers中。HashSet<Worker> workers = new HashSet<Worker>(); workers.add(w);
ctl.get()线程运行状态和线程数量
Worker(Runnable firstTask) { setState(-1); // 设置当前状态为 running this.firstTask = firstTask; // 把当前任务赋值给自身firstTask属性 this.thread = getThreadFactory().newThread(this); // 创建Worker自身的线程 此时入参的当前任务 已经被Worker吃掉}
运行线程数<核心线程数
回收多余线程
addWorker(当前任务)
true
task.run();真正执行任务
completedAbruptly = false; // 任务完成状态
interruptIdleWorkers(ONLY_ONE);终止当前线程
任务重新赋值Runnable task = w.firstTask;
高三位线程状态,低29位线程数量private static final int RUNNING = -1 << COUNT_BITS; // 111private static final int SHUTDOWN = 0 << COUNT_BITS; // 000private static final int STOP = 1 << COUNT_BITS; // 001private static final int TIDYING = 2 << COUNT_BITS; // 010private static final int TERMINATED = 3 << COUNT_BITS; // 011
w = new Worker(当前任务);
tryTerminate()尝试终止interrupt
false
workers.remove(w);删除当前Woker
timedOut= ture;通过cas减少工作线程计数ctl.get()return null;
工作线程数 > 核心线程数
启动w的自身线程t.start()
因为w实现了Runnable接口 所以t.start时。走到w的run()方法
工作线程数 != 0
0 条评论
下一页