Java基础 -> 线程的生命周期?线程有几种状态?
2022/2/27 17:52:24
本文主要是介绍Java基础 -> 线程的生命周期?线程有几种状态?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
线程的生命周期?线程有几种状态?
线程通常有五种状态,创建,就绪,运⾏、阻塞和死亡状态:
-
创建状态
(New):新创建了⼀个线程对象。- 仅仅是线程对象,操作系统线程还没有创建
- 关键操作:
new Thread();
-
就绪状态
(Runnable):线程对象创建后,其他线程调⽤了该对象的start⽅法。该状态的线程位于 可运⾏线程池中,变得可运⾏,等待获取CPU的使⽤权。- 操作系统创建线程,线程进入
CPU队列
,等待获取CPU的使⽤权 - 关键操作:
start();
- 操作系统创建线程,线程进入
-
运⾏状态
(Running):就绪状态的线程获取了CPU,执⾏程序代码。- 关键操作:
run();
- 关键操作:
-
阻塞状态
(Blocked):阻塞状态是线程因为某种原因放弃CPU使⽤权,暂时停⽌运⾏。直到线程进⼊就绪状态,才有机会转到运⾏状态。- 线程进入
阻塞队列
,放弃CPU使⽤权 - 等待从阻塞队列弹出,再次进入CPU队列,就是就绪状态
- 关键操作:
wait() notify()
sleep() join() yield()
- 线程进入
-
死亡状态
(Dead):线程执⾏完了或者因异常退出了run⽅法,该线程结束⽣命周期。
再这些状态中,阻塞状态是知识点最多的,也是最主要的点
阻塞的情况⼜分为三种:
-
等待阻塞
:运⾏的线程执⾏wait⽅法
,该线程会释放占⽤的所有资源,JVM会把该线程放⼊“等待池”中。进⼊这个状态后,是不能⾃动唤醒的,必须依靠其他线程调⽤notify或notifyAll
⽅法才能被唤醒,wait是object类的⽅法- 这种情况的特点是 ->
主动
将线程从cpu队列弹出,加入到阻塞队列中 - 相对的需要 ->
主动
让线程从阻塞队列弹出,加入cpu队列,才能正常运行线程 - 注意: 会释放锁 ->
只有这里会释放锁,下面情况的都不会释放锁
,只能等锁用完自己释放
- 这种情况的特点是 ->
-
同步阻塞
:运⾏的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放⼊“锁池”中。- 这种情况的特点是 -> 锁被占用
被动
的阻塞了线程,使得线程不能正常工作 - 线程放⼊“锁池”中 -> 这里的锁池算是特殊的一个cpu队列
- cpu依旧可以获取线程,但是获取的前置操作是先获取锁
- 类似Spring的AOP,cpu执行这个线程,要先经过before方法获取锁成功,否则让出此次cpu使用权
- 注意: 不会释放锁
- 这种情况的特点是 -> 锁被占用
-
其他阻塞
:运⾏的线程执⾏sleep或join⽅法
,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep状态超时、join等待线程终⽌或者超时、或者I/O处理完毕时,线程重新转⼊就绪状态。sleep是Thread类的⽅法- 这种情况的特点是 ->
主动
将线程从cpu队列弹出,加入到超时阻塞队列中 - 相对的 ->
超时或者完成规定的要求
后从超时阻塞队列弹出,加入cpu队列,正常运行线程
- 这种情况的特点是 ->
这篇关于Java基础 -> 线程的生命周期?线程有几种状态?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-29设计Element UI表单组件居然如此简单!
- 2024-12-28一步到位:购买适合 SEO 的域名全攻略
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign学习入门:轻松掌握微服务通信
- 2024-12-27OpenFeign学习入门:轻松掌握微服务间的HTTP请求
- 2024-12-27JDK17新特性学习入门:简洁教程带你轻松上手
- 2024-12-27JMeter传递token学习入门教程
- 2024-12-27JMeter压测学习入门指南
- 2024-12-27JWT单点登录学习入门指南