前言
本篇文章将结合ThreadPoolExecutor
的部分源码,认识ThreadPoolExecutor
中的五种线程池状态。
正文
ThreadPoolExecutor
继承于AbstractExecutorService
,并实现了ExecutorService
接口,是Executor
框架的核心类,用于管理线程。
ThreadPoolExecutor
使用了原子整型ctl来表示线程池状态和Worker数量。ctl是一个原子整型,前3位表示线程池状态,后29位表示Worker数量。ThreadPoolExecutor
中这部分的源码如下所示。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38public 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原理解析-认识线程池状态的全部内容,更多相关三.内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复