概述
前言
本篇文章将结合ThreadPoolExecutor
的部分源码,认识ThreadPoolExecutor
中的五种线程池状态。
正文
ThreadPoolExecutor
继承于AbstractExecutorService
,并实现了ExecutorService
接口,是Executor
框架的核心类,用于管理线程。
ThreadPoolExecutor
使用了原子整型ctl来表示线程池状态和Worker数量。ctl是一个原子整型,前3位表示线程池状态,后29位表示Worker数量。ThreadPoolExecutor
中这部分的源码如下所示。
public class ThreadPoolExecutor extends AbstractExecutorService {
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
private static final int COUNT_BITS = Integer.SIZE - 3;
private static final int CAPACITY = (1 << COUNT_BITS) - 1;
private 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;
// 取整型前3位,即获取线程池状态
private static int runStateOf(int c) { return c & ~CAPACITY; }
// 取整型后29位,即获取Worker数量
private static int workerCountOf(int c) { return c & CAPACITY; }
// 根据线程池状态和Worker数量拼装ctl
private static int ctlOf(int rs, int wc) { return rs | wc; }
// 线程池状态判断
private static boolean runStateLessThan(int c, int s) {
return c < s;
}
// 线程池状态判断
private static boolean runStateAtLeast(int c, int s) {
return c >= s;
}
// 判断线程池状态是否为RUNNING
private static boolean isRunning(int c) {
return c < SHUTDOWN;
}
......
}
总结
在ThreadPoolExecutor
中规定了线程池的状态如下。
- RUNNING,线程池接受新任务,会执行任务阻塞队列中的任务,ctl前三位表示为111;
- SHUTDOWN,线程池拒绝新任务,会执行任务阻塞队列中的任务,ctl前三位表示为000;
- STOP,线程池拒绝新任务,不会执行任务阻塞队列中的任务,尝试中断正在执行的任务,ctl前三位表示为001;
- TIDYING,所有任务被关闭,Worker数量为0,ctl前三位表示为010;
- TERMINATED,
terminated()
执行完毕,ctl前三位表示为011。
得益于ctl的结构,所以无论Worker数量是多少,ThreadPoolExecutor
中线程池状态存在如下关系。
RUNNING < SHUTDOWN < STOP < TIDYING < TERMINATED
因此runStateLessThan()
,runStateAtLeast()
和isRunning()
方法可以方便的对线程池状态进行判断。
最后
以上就是笨笨鸵鸟为你收集整理的三. ThreadPoolExecutor原理解析-认识线程池状态的全部内容,希望文章能够帮你解决三. ThreadPoolExecutor原理解析-认识线程池状态所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复