网站首页 > java教程 正文
在 Java 中,线程池的状态和线程的状态是完全不同的,线程有 6 种状态:NEW:初始化状态、RUNNABLE:可运行/运行状态、BLOCKED:阻塞状态、WAITING:无时限等待状态、TIMED_WAITING:有时限等待状态和 TERMINATED:终止状态。而线程池的状态有以下 5 种:
- RUNNING:运行状态,线程池创建好之后就会进入此状态,如果不手动调用关闭方法,那么线程池在整个程序运行期间都是此状态。
- SHUTDOWN:关闭状态,不再接受新任务提交,但是会将已保存在任务队列中的任务处理完。
- STOP:停止状态,不再接受新任务提交,并且会中断当前正在执行的任务、放弃任务队列中已有的任务。
- TIDYING:整理状态,所有的任务都执行完毕后(也包括任务队列中的任务执行完),当前线程池中的活动线程数降为 0 时的状态。到此状态之后,会调用线程池的 terminated() 方法。
- TERMINATED:销毁状态,当执行完线程池的 terminated() 方法之后就会变为此状态。
这 5 种状态可以在 ThreadPoolExecutor 源码中找到,如下图所示:
线程池状态转移
线程池的状态转移有两条路径:
- 当调用 shutdown() 方法时,线程池的状态会从 RUNNING 到 SHUTDOWN,再到 TIDYING,最后到 TERMENATED 销毁状态。
- 当调用 shutdownNow() 方法时,线程池的状态会从 RUNNING 到 STOP,再到 TIDYING,最后到 TERMENATED 销毁状态。
线程状态转换的流程如下图所示:
terminated方法
线程池中的 terminated() 方法,也就是线程池从 TIDYING 转换到 TERMINATED 状态时调用的方法,默认是空的,它的源码如下:
我们可以在创建线程池的时候重写 terminated() 方法,具体实现代码如下:
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolStateTransition {
public static void main(String[] args) throws InterruptedException {
// 创建线程池
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10, 0L,
TimeUnit.SECONDS, new LinkedBlockingQueue<>(100)) {
@Override
protected void terminated() {
super.terminated();
System.out.println("执行 terminated() 方法");
}
};
// 关闭线程池
threadPool.shutdown();
// 等待线程池执行完再退出
while (!threadPool.awaitTermination(1, TimeUnit.SECONDS)) {
System.out.println("线程池正在运行中");
}
}
}
总结
线程池的状态总共有 5 种:RUNNING:运行状态、SHUTDOWN:关闭状态、STOP:停止状态、TIDYING:整理状态和 TERMINATED:销毁状态。默认情况下,如果不调用关闭方法,线程池会一直处于 RUNNING 状态,而线程池状态的转移有两个路径:当调用 shutdown() 方法时,线程池的状态会从 RUNNING 到 SHUTDOWN,再到 TIDYING,最后到 TERMENATED 销毁状态;当调用 shutdownNow() 方法时,线程池的状态会从 RUNNING 到 STOP,再到 TIDYING,最后到 TERMENATED 销毁状态。
猜你喜欢
- 2024-12-12 Java 应用性能瓶颈剖析与多线程优化实战
- 2024-12-12 面试突击35:如何判断线程池已经执行完所有任务了?
- 2024-12-12 吞吐下降、RT增长、CPU飚高,都是 线程状态惹的祸?
- 2024-12-12 一文搞懂Java多线程
- 2024-12-12 Java线程池的关闭
- 2024-12-12 你能说出多线程中sleep、yield、join的用法及sleep与wait区别?
- 2024-12-12 队列满了、任务还在提交,看看Java线程池的任务饱和策略
- 2024-12-12 「重磅开篇」形成完善的多线程世界观
- 2024-12-12 一文深入理解java中的线程
- 2024-12-12 全局视角看技术-Java多线程演进史
你 发表评论:
欢迎- 最近发表
-
- pyinstaller打包python程序高级技巧
- 将python打包成exe的方式(python打包成exe的方法)
- Python打包:如何将 Flask 项目打包成exe程序
- py2exe实现python文件打包为.exe可执行程序(上篇)
- 如何将 Python 项目打包成 exe,另带卸载功能!
- Python打包成 exe,太大了该怎么解决?
- 可视化 Python 打包 exe,这个神器绝了!
- 案例详解pyinstaller将python程序打包为可执行文件exe
- Cocos 3.x 菜鸟一起玩:打包window程序
- 怎么把 Python + Flet 开发的程序,打包为 exe ?这个方法很简单!
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)