【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 后还要抢锁
相关推荐
江畔柳前堤2 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
Wang's Blog3 小时前
Go-Zero 项目开发47:自研微服务框架的必要性与核心结构设计
开发语言·微服务·golang
白鸽(二般)3 小时前
MinIO Java Client API
java·开发语言
hPw0eKIqD3 小时前
C++ 模板参数推导问题小记(非推导上下文)
开发语言·c++
临床数据科学和人工智能兴趣组4 小时前
要使用 R Markdown,首先需要安装 R 和 RStudio,接着安装 rmarkdown 包
开发语言·数据挖掘·数据分析·r语言·r语言-4.2.1
软萌萌的14 小时前
Java Spring Boot 修改yml配置&加载顺序规则
java·spring boot·python
Nebula嵌入式4 小时前
【C语言】09-深入解析main函数
linux·c语言·开发语言·嵌入式
IT小盘5 小时前
13-企业Prompt模板-角色任务约束与输出格式
java·前端·prompt
爱敲键盘的猴子5 小时前
Java并发编程 -- volatile
java·java并发
神罚天下ET6 小时前
c# ACME client (补充)
开发语言·c#