我是靠谱客的博主 笨笨鸵鸟,这篇文章主要介绍三. ThreadPoolExecutor原理解析-认识线程池状态,现在分享给大家,希望可以做个参考。

前言

本篇文章将结合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
38
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;
  • TERMINATEDterminated()执行完毕,ctl前三位表示为011。

得益于ctl的结构,所以无论Worker数量是多少,ThreadPoolExecutor中线程池状态存在如下关系。

RUNNING < SHUTDOWN < STOP < TIDYING < TERMINATED

因此runStateLessThan()runStateAtLeast()isRunning()方法可以方便的对线程池状态进行判断。

最后

以上就是笨笨鸵鸟最近收集整理的关于三. ThreadPoolExecutor原理解析-认识线程池状态的全部内容,更多相关三.内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部