【Java 6种线程状态】

Java 6种线程状态 · 极简速记

一、6种状态核心定义(按生命周期排序)

状态 含义 触发场景
NEW 线程刚创建,还没调用 start() new Thread() 之后
RUNNABLE 可运行状态(包含就绪/运行中) 调用 start() 后,或从阻塞/等待状态恢复
BLOCKED 锁竞争失败,阻塞等待 synchronized 抢内置锁失败;wait() 被唤醒后抢锁失败
WAITING 无限期等待,需要别人主动唤醒 wait() / join() / LockSupport.park()
TIMED_WAITING 有限期等待,超时自动唤醒 sleep() / wait(time) / join(time) / parkNanos()
TERMINATED 线程执行完毕,生命周期结束 run() 方法正常执行完 / 抛出异常终止

二、关键状态辨析

1. BLOCKED vs WAITING / TIMED_WAITING

维度 BLOCKED WAITING / TIMED_WAITING
触发原因 synchronized 锁失败 主动调用 wait() / sleep() / join() 等方法
是否释放锁 不释放锁(锁被别人拿着,自己排队) 会释放锁(比如 wait() 会主动释放锁)
唤醒方式 持有锁的线程释放锁后,自动抢锁 notify() / notifyAll() 唤醒,或超时唤醒
核心区别 被动阻塞,和锁强相关 主动等待,可由时间或其他线程唤醒

2. 为什么 sleep() 不会释放锁,而 wait() 会?

  • sleep():只是让线程睡一会儿,不涉及锁的操作,锁依然被持有
  • wait():必须在 synchronized 代码块内调用,会主动释放锁,让其他线程有机会获取锁

三、完整状态流转图

复制代码
NEW
  ↓ start()
RUNNABLE
  ↓(抢synchronized锁失败)
BLOCKED
  ↓(抢到锁)
RUNNABLE
  ↓ wait() / join()
WAITING
  ↓ notify() / notifyAll() / 被唤醒后抢锁失败
BLOCKED
  ↓(抢到锁)
RUNNABLE
  ↓ sleep() / wait(time) / join(time)
TIMED_WAITING
  ↓ 时间到 / 被唤醒
RUNNABLE
  ↓ run()执行完毕
TERMINATED

四、常见问题

Q1:线程调用 sleep() 时,状态是什么?会释放锁吗?

状态:TIMED_WAITING

不会释放锁,只是暂停执行,锁依然被持有。

Q2:线程调用 wait() 后,状态是什么?被 notify() 后会直接运行吗?

调用 wait() 后:进入 WAITING 状态,同时释放锁。

notify() 后:不会直接运行,而是需要重新抢锁。

抢锁成功 → 变回 RUNNABLE;抢锁失败 → 进入 BLOCKED 状态。

Q3:线程处于 BLOCKED 状态时,能被 interrupt() 中断吗?

不能。interrupt() 只能中断处于 WAITING / TIMED_WAITING 状态的线程,抛出 InterruptedException
BLOCKED 状态的线程只能等抢到锁,或者JVM退出才会结束。

Q4:为什么 synchronized 锁竞争失败会进入 BLOCKED,而 ReentrantLock 抢锁失败是 WAITING

因为 ReentrantLock 底层用的是 LockSupport.park(),会让线程进入 WAITING 状态,而不是 BLOCKED
BLOCKEDsynchronized 内置锁特有的状态。


五、超简记忆口诀

  • NEW 新生,RUNNABLE 就绪
  • 抢锁失败 BLOCKED,主动等待 WAITING
  • 限时等待 TIMED_WAITING,跑完 TERMINATED
  • wait 放锁,sleep 不放锁,notify 后还要抢锁
相关推荐
无毁的湖光-Al3 分钟前
解Bug之路-with AI-应用被限流?
java·linux
程序员贺加贝8 分钟前
别把 ThreadLocal 写进 Serializer:一次 SaaS 多租户 Jackson 上下文污染排查
java·spring boot
许彰午16 分钟前
06-EaEngine调度器
java·低代码·架构
练习时长两年半的RL练习生17 分钟前
与AI对话后对 Actor-Critic 中 TD Target 的 a‘ 来源总结
开发语言·人工智能·php
十五年专注C++开发42 分钟前
100w条数据丝滑滚动!Qt Model/View 架构实战(二)
开发语言·c++·qt
卓怡学长1 小时前
w181springboot机场乘客服务系统
java·数据库·spring boot·spring·intellij-idea
萧瑟余晖1 小时前
Java深入解析篇三十九之集成测试
java·开发语言·集成测试
skr爱码士1 小时前
06_Qt 常用数据类型与容器:QString、QList、QVector、QMap 的性能与实现分析
开发语言·c++·qt
总有刁民想爱朕ha1 小时前
零基础Python开发「图片批量转MP4视频」工具,本地离线、免费无水印
开发语言·python·音视频
l1t1 小时前
测试DuckDB luajit插件读取本地通达信文件
开发语言·数据库·duckdb