详细介绍java的线程池状态
一、详细介绍java的线程池状态
Java 中的线程池状态是 ThreadPoolExecutor 类内部管理的一个重要概念。线程池的状态决定了线程池的行为,例如是否接受新任务、是否处理队列中的任务、是否中断正在执行的任务等。
线程池的状态通过一个 AtomicInteger 变量(ctl)来表示,该变量同时存储了线程池的状态和线程数量
1、线程池状态的表示
ThreadPoolExecutor 使用一个 32 位的 AtomicInteger 变量(ctl)来同时表示线程池的状态和线程数量
-
高 3 位:表示线程池的状态。
-
低 29 位:表示线程池中的线程数量。
2、线程池的五种状态
线程池的状态包括以下五种:
2.1、RUNNING(运行状态)
-
值:11100000 00000000 00000000 00000000(十进制:-536870912)
-
描述:
-
线程池处于正常运行状态。
-
可以接受新任务并处理队列中的任务。
-
-
触发条件:线程池初始化时默认处于 RUNNING 状态
2.2、SHUTDOWN(关闭状态)
-
值:00000000 00000000 00000000 00000000(十进制:0)
-
描述:
-
线程池不再接受新任务。
-
但会继续处理队列中的任务。
-
-
触发条件:调用 shutdown() 方法。
2.3、STOP(停止状态)
-
值:00100000 00000000 00000000 00000000(十进制:536870912)
-
描述:
-
线程池不再接受新任务。
-
不再处理队列中的任务。
-
会中断正在执行的任务。
-
-
触发条件:调用 shutdownNow() 方法。
2.4、TIDYING(整理状态)
-
值:01000000 00000000 00000000 00000000(十进制:1073741824)
-
描述:
-
任务全执行完毕,活动线程为 0 即将进入终结。
-
即将调用 terminated() 方法。
-
-
触发条件:
-
当线程池从 SHUTDOWN 状态变为空(队列为空且线程数量为 0)时。
-
当线程池从 STOP 状态变为线程数量为 0 时。
-
2.5、TERMINATED(终止状态)
-
值:01100000 00000000 00000000 00000000(十进制:1610612736)
-
描述:
-
线程池完全终止。
-
terminated() 方法已执行完毕。
-
-
触发条件:terminated() 方法执行完成后。
3、线程池状态的转换
线程池的状态转换遵循以下规则:
3.1、RUNNING -> SHUTDOWN:
-
调用 shutdown() 方法。
-
不再接受新任务,但会处理队列中的任务。
3.2、RUNNING/SHUTDOWN -> STOP:
-
调用 shutdownNow() 方法。
-
不再接受新任务,不再处理队列中的任务,并中断正在执行的任务。
3.3、SHUTDOWN -> TIDYING:
- 队列为空且线程数量为 0。
3.4、STOP -> TIDYING:
- 线程数量为 0
3.5、TIDYING -> TERMINATED:
- terminated() 方法执行完毕
4、线程池状态的源码分析
以下是 ThreadPoolExecutor 中与线程池状态相关的源码片段:
4.1 状态常量
4.2 状态判断方法
状态对比:RUNNING < SHUTDOWN < STOP < TIDYING < TERMINATED
private static boolean isRunning(int c) {
return c < SHUTDOWN;
}
isRunning方法的作用是判断传入的整数 c 是否小于 SHUTDOWN。如果 c 小于 SHUTDOWN,则认为线程池正在运行,返回 true;否则返回 false
private static boolean isStopped(int c) {
return c >= STOP;
}
isStopped方法的作用是判断传入的整数 c 是否大于或等于 STOP。如果 c 大于或等于 STOP,则认为线程池已经停止,返回 true;否则返回 false
private static boolean isTerminated(int c) {
return c >= TERMINATED;
}
isTerminated方法的作用是判断传入的整数 c 是否大于或等于 TERMINATED。如果 c 大于或等于 TERMINATED,则认为线程池已经终止,返回 true;否则返回 false
4.3 状态转换方法
5、线程池状态的应用
5.1、判断线程池是否运行中
5.2、关闭线程池
5.3、等待线程池终止
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战