网站首页 > java教程 正文
在 Java 多线程编程领域中,线程状态是一个至关重要且不可忽视的概念。线程状态描述了线程在其生命周期中的当前行为和状况,是理解和调试多线程应用的关键。通过理解线程状态,才能更有效地管理并发任务,提升应用性能和稳定性。
JDK源码中 java.lang.Thread.State 枚举定义了六种线程状态。包括:
NEW(新建)
RUNNABLE(可运行)
BLOCKED(阻塞)
WAITING(无限等待)
TIMED_WAITING(限时等待)
TERMINATED(终止)
在任一时刻,一个 Java 线程都有且仅有一种状态。线程状态之间的转换是通过特定的方法来实现的。下表详细探讨了这些状态的定义、转换条件。
新建 New | 创建线程对象,Thread t = new Thread(); 进入新建状态。 |
可运行 Runnable | 可运行态包含了操作系统的 “就绪态Ready” 和 “运行态Running”。线程调用 Thread::start() 方法,系统为其分配必要资源,New 转为 Runnable 进入就绪态,然后线程被添加到线程调度器队列中等待执行,获取到 CPU 时间片后执行 Runnable::run() 方法。 |
阻塞 Blocked | 线程在等待获取一个锁以进入或重新进入同步代码块时(syncronized),它会进入阻塞状态。当阻塞的原因消失,线程重新转入 Runnable (可运行)态。 |
无限等待 Waiting | 处于无限等待状态的线程不会被分配 cpu 时间片,需要等待其他线程的操作完成或者等待 notify()/notifyAll() 消息显式唤醒。以下方法会使线程进入无限等待状态: 1. Object::wait(); 2. Thread::join(); 3. LockSupport::park(); |
限时等待 Timed Waiting | 与无限等待状态相似,进入现时等待状态的线程不会被分配 cpu 时间片,不过无需等待被其他线程显式唤醒,在一定时间后由系统唤醒。以下方式会使线程进入优先等待状态: 1. Thread::sleep(); 2. Object::wait(Timeout); 3. Thread::join(Timeout); 4. LockSupport::parkNanos(); 5. LockSupport::parkUntil(); |
终止 Terminated | 进入终止状态,意味着当前线程执行结束退出,再无法回到其他状态。 1. 线程 run() 方法结束,线程自动终止(无论是正常 return 结束,还是抛出未捕获的异常时结束) 2. 调用 stop() 方法(已被废弃) 3. 调用 interrupt() 方法,线程通过检查中断标志位决定是否终止执行 4. 使用共享变量。自定义一个中断标志位,并在外部进行修改。这个标志位需要用volatile进行修饰 |
上表总结为第二张图:
参考资料:
JDK-1.8.0_431 源码
JSR-133 草案
《深入理解Java虚拟机》第3版——周志明
END
文章对您有用的话,记得 点赞 关注 收藏 哦,
您的支持,就是我更新的最大动力~
猜你喜欢
- 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多线程演进史
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 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)
本文暂时没有评论,来添加一个吧(●'◡'●)