赞
踩
ThreadPoolExecutor的execute方法执行流程
前言
【Java线程池01】Java线程池简介
此文中对Java线程池简介,包含线程池相关的几个类的关系等。
【Java线程池02】ThreadPoolExecutor类概述
此文介绍了ThreadPoolExecutor的构造函数、核心字段以及核心方法
这篇文章将学习总结ThreadPoolExecutor的核心方法execute的执行流程
**
源码分析
从上述执行流程中我们可以得知,其核心点为addWorker方法,下篇文章将详细分析总结addWorker方法。
理解ThreadPoolExecutor中execute()方法原理
首先普及一下什么使ctl
ctl位操作变量
ThreadPoolExecutor有一个AtomicInteger变量,叫ctl(control的简写),一共32位,
高3位为线程池的状态runstatus(5中:Running,Shutdown,Stop,Tidying,Terminate),
低29位存当前有效线程数workerCount
分析execute()方法的原理
下面是execute的源码
public void execute(Runnable command) { if (command == null) throw new NullPointerException(); int c = ctl.get(); //判断工作线程数小于核心线程数 if (workerCountOf(c) < corePoolSize) { //执行addworker,创建一个核心线程,创建失败重新获取ctl if (addWorker(command, true)) return; c = ctl.get(); } //如果工作线程数大于核心线程数,判断线程池的状态是否为running,并且可以添加进队列 //如果线程池不是running状态,则执行拒绝策略,(还是会调用一次addworker) if (isRunning(c) && workQueue.offer(command)) { //再次获取ctl,进行双重检索 int recheck = ctl.get(); //如果线程池是不是处于RUNNING的状态,那么就会将任务从队列中移除, //如果移除失败,则会判断工作线程是否为0 ,如果过为0 就创建一个非核心线程 //如果移除成功,就执行拒绝策略,因为线程池已经不可用了; if (! isRunning(recheck) && remove(command)) reject(command); else if (workerCountOf(recheck) == 0) addWorker(null, false); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。