workQueue;// 互斥锁private final ReentrantLock mainLock = new ReentrantLock();// 包含线程池工作的所以线程 , 仅在持有mainLock的时候能访问private final HashSet workers = new HashSet();private final Condition termination = mainLock.newCondition();// 跟踪线程池最大的大小(实际的最大值) , 仅在持有mainLock的时候能访问private int largestPoolSize;// 记录已经完成的任务数 , 仅在工作线程终止时更新 , 仅在持有mainLock的时候能访问private long completedTaskCount;// 线程工厂private volatile ThreadFactory threadFactory;// 线程池饱和或者关闭时的执行器private volatile RejectedExecutionHandler handler;// 空闲线程等待工作的超时时间private volatile long keepAliveTime;// 如果为false(默认值) , 核心线程永远不回收// 如果为true , 核心线程也通过keepAliveTime参数超时回收private volatile boolean allowCoreThreadTimeOut;// 核心线程数private volatile int corePoolSize;// 最大线程数(程序设置的最大线程数 , 区别于largestPoolSize)private volatile int maximumPoolSize;// 默认的拒绝策略处理器 , 抛出RejectedExecutionException异常private static final RejectedExecutionHandler defaultHandler =new AbortPolicy();}涉及到的成员变量、常量比较多 , 也不太容易理解 , 不过看完整篇后再来回顾这里 , 就很容易理解了 。
生命周期ThreadPoolExecutor类提供了线程池的五个状态描述
// runState is stored in the high-order bitsprivate static final int RUNNING= -1 << COUNT_BITS;private static final int SHUTDOWN=0 << COUNT_BITS;private static final int STOP=1 << COUNT_BITS;private static final int TIDYING=2 << COUNT_BITS;private static final int TERMINATED =3 << COUNT_BITS;这几种状态之间的转换过程如下
![车驰夜幕|ThreadPoolExecutor线程池实现原理+源码解析]()
- RUNNING:运行状态 , 可以执行任务 , 也可以接受阻塞队列里的任务调度
- SHUTDOWN:调用了shutdown()方法 , 该状态可以继续执行阻塞队列中的任务 , 但是不会再接受新任务
- STOP:调用了shutdownNow()方法 , 该状态会尝试中断正在执行的所有任务 , 不能继续执行阻塞队列中的任务 , 也不会再接受新任务
- TIDYING:所有任务都执行完毕 , 至于阻塞队列中的任务是否执行完成 , 取决于调用了shutdown()还是shutdownNow()方法
- TERMINATED:terminated()方法执行完成后进入该状态 , terminated()方法默认没有任何操作
构造方法ThreadPoolExecutor提供了四个构造方法 , 忽略它提供的语法糖 , 我们直接看最吊的那个构造方法:
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {if (corePoolSize < 0 ||maximumPoolSize <= 0 ||maximumPoolSize < corePoolSize ||keepAliveTime < 0)// corePoolSize、maximumPoolSize、keepAliveTime都不能小于0// 且maximumPoolSize必须大于等于corePoolSizethrow new IllegalArgumentException();if (workQueue == null || threadFactory == null || handler == null)// workQueue、threadFactory、handler均不能为nullthrow new NullPointerException();this.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.workQueue = workQueue;this.keepAliveTime = unit.toNanos(keepAliveTime);this.threadFactory = threadFactory;this.handler = handler;}
推荐阅读
-
吉美家庭教育|吉美特训营第四天之冥想——与父母的链接
-
-
电视剧|金钟《想见你》成大赢家!红到韩国粉丝追直播,苦等许光汉&柯佳嬿领奖结果!
-
-
大S吐槽当妈后不能演少女被网友怒斥|大S吐槽当妈后不能演少女被网友怒斥!
-
双方|拟斥近13亿入主世纪鼎利希望教育高管:双方教育业务能够协同
-
恒华军事|俄将统一侧卫战斗机的心脏,能解决很多问题,意图向中国大量出口
-
猝死|提离职被HR回复猝死了再说 当事人:对方已道歉
-
#风玄阁算命#可以先暖暖摩羯男的胃!摩羯男喜欢听暖心的话陪摩羯男去听歌、K歌结语:爱他就要想办法让他开心,怎么让摩羯男开心快乐?想要哄摩羯男开心可以从以下几点入手:摩羯喜欢美食
-
当你下定决心做好某件事,却忍不住做起了别的事情,这个时候要咋有效停止这种行为
-
幽默搞笑段子集锦|感觉她比老婆还能作,幽默笑话:离婚之后我娶了小姨子
-
胖次资讯|美翻了!女子组合 CLC 公布全新LOGO和官方应援色
-
-
『军事哥谈』特别是邮政储蓄银行, 为什么他们拼命叫你买理财?,去银行存钱,
-
-
山洪|长江干流大通站以上已过洪峰 安徽发布山洪红色预警
-
《烟火人家》大结局:老公凑合也能过,她非要离婚的根源是什么?
-
于谦|于谦:我和郭德纲不是一路人,台上是好搭档,台下生活都各过各的
-
「特朗普」事态反转!美国遇害黑人“尸检报告”公布,美民众:特朗普立刻下台
-