一图流解释Java中线程状态的转换


目录

一.Java中的几大线程状态

二.线程之间的相互转换

[▐ NEW --> RUNNABLE](#▐ NEW --> RUNNABLE)

[▐ RUNNABLE <--> WAITING](#▐ RUNNABLE <--> WAITING)

[▐ RUNNABLE <--> Timed Waiting](#▐ RUNNABLE <--> Timed Waiting)

[▐ RUNNABLE<--> BLOCKED](#▐ RUNNABLE<--> BLOCKED)

[▐ RUNNABLE<-->TERMINATED](#▐ RUNNABLE<-->TERMINATED)


一.Java中的几大线程状态

简单来说线程可以处于以下几种状态:

  1. 新建状态(New): 当线程对象被创建时,它处于新建状态。此时线程还没有开始执行。

  2. 就绪状态(Runnable): 当线程对象被创建后,其他线程调用了该线程的start()方法,该线程进入就绪状态。处于就绪状态的线程可能正在等待CPU时间片,一旦获取到CPU时间片,就可以执行。

  3. 运行状态(Running): 线程获取到CPU时间片后,开始执行任务,处于运行状态。

  4. 阻塞状态(Blocked): 线程在某些情况下会进入阻塞状态,如调用sleep()方法、等待I/O操作完成、试图获取锁时被其他线程获取等。在这些情况下,线程暂时停止执行。

  5. 等待状态(Waiting): 线程进入等待状态是因为调用了wait()方法或类似的方法,该状态下线程会等待其他线程显式地唤醒。

  6. 超时等待状态(Timed Waiting): 线程调用了带有超时参数的sleep()方法、join()方法、wait()方法中的带超时参数的重载方法,或者调用了LockSupport类的parkNanos()、parkUntil()方法时,线程会进入超时等待状态。

  7. 终止状态(Terminated): 线程执行完任务后或者因异常退出了run()方法,线程进入终止状态。

一图流展示:

二.线程之间的相互转换

**▐**NEW --> RUNNABLE

当线程对象被创建后,其他线程调用了该线程的start()方法,该线程进入就绪状态:NEW --> RUNNABLE

**▐**RUNNABLE <--> WAITING

关于notify

当线程t 用 synchronized(obj) 获取了对象锁后,调用obj.wait() 方法时,线程t从RUNNABLE-->WAITING

调用obj.notify(),obj.notifyAll(),t.interrupt() 时会竞争锁,竞争锁成功,线程t 从 WAITING-->RUNNABLE,竞争锁失败,线程t从WAITING-->BLOCKED


关于join

当前线程 调用 t.join() 方法时,当前线程从RUNNABLE-->WAITING

线程t 运行结束或调用了当前线程的 interrupt()时,当前线程从WAITING-->RUNNABLE


关于park

当前线程 调用 Locksupport.park() 方法会让当前线程从RUNNABLE-->WAITING

调用 Locksupport.unpark(目标线程 )或调用了线程的interrupt(),会让目标线程从WAITING --> RUNNABLE

▐ RUNNABLE <--> Timed Waiting

关于wait

线程t 用 synchronized(obj) 获取了对象锁后,调用 obj.wait(long n) 方法时,线程t从RUNNABLE-->TIMED_WAITING

线程t 等待时间超过了n毫秒,或调用 obj.notify(),obj.notifyAll(),t.interrupt()时,竞争锁成功,线程t 从TIMEDWAITING->RUNNABLE,竞争锁失败,线程t从TIMEDWAITING-->BLOCKED


关于join

当前线程 调用 t.join(long n) 方法时,当前线程从RUNNABLE-->TIMED_WAITING

当前线程 等待时间超过了n毫秒,或线程t 运行结束,或调用了当前线程 的interrupt()时,当前线程从TIMED WAITING->RUNNABLE


关于sleep

当前线程 调用 Thread.sleep(long n),当前线程从RUNNABLE-->TIMED_WAITING

当前线程 等待时间超过了n毫秒,当前线程从TIMEDWAITING->RUNNABLE


关于park

当前线程 调用 Locksupport.parkNanos(long nanos) 或 Locksupport.parkUntil(long millis)时,当前线程从RUNNABLE-->TIMED_WAITING

调用 Locksupport.unpark(日标线程 )或调用了线程的interrupt(),或是等待超时,会让目标线程从TIMED WAITING--> RUNNABLE

**▐**RUNNABLE<--> BLOCKED

线程t用 synchronized(obj)获取了对象锁时如果竞争失败,从 RUNNABLE -->BLOCKED

持obj锁线程的同步代码块执行完毕,会唤醒该对象上所有 BL0CKED 的线程重新竞争,如果其中线程t竞争成功,从BLOCKED-->RUNNABLE,其它失败的线程仍然BLOCKED

**▐**RUNNABLE<-->TERMINATED

当前线程所有代码运行完毕,进入TERMINATED




本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力! 如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步! 有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见

相关推荐
1024奇点4 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
Warren2Lynch5 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
天河归来5 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
Knight_AL6 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
FRing036 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
by209997 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河7 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
IT召唤狮7 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php
知已难寻7 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
m0_719640877 小时前
2026年高校科研机构轮式双臂机器人二次开发平台搭建测评指南
经验分享·机器人