0

0

Java中线程的状态有哪些_NEW、RUNNABLE、BLOCKED、WAITING等六种状态流转详解

P粉602998670

P粉602998670

发布时间:2026-03-16 15:26:57

|

880人浏览过

|

来源于php中文网

原创

Java线程六种状态对应JVM对执行权和调度权的具体判断:NEW(新建)、RUNNABLE(就绪或运行中)、BLOCKED(等待synchronized锁)、WAITING(无限期等待唤醒)、TIMED_WAITING(带超时等待)、TERMINATED(终止),状态迁移受JVM严格限制,不可逆且不可越级。

java中线程的状态有哪些_new、runnable、blocked、waiting等六种状态流转详解

Java线程的六种状态到底对应什么行为

Java线程不是“运行中”或“没运行”这么简单,NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED 这六种状态,每一种都对应 JVM 对线程执行权和调度权的具体判断。

比如 RUNNABLE 并不等于“正在 CPU 上跑”,它包含“就绪”和“运行中”两种子状态——JVM 不区分,但你排查 CPU 占用高时得意识到:一个线程标为 RUNNABLE,可能正疯狂轮询,也可能刚被 OS 调度出去、还没轮到它。

常见误解是把 BLOCKEDWAITING 混为一谈。前者只发生在进入 synchronized 块/方法时抢不到锁;后者是主动调用 Object.wait()Thread.join()LockSupport.park() 等让出执行权的结果。

怎么准确查看某个线程当前处于哪种状态

别依赖 IDE 的线程视图或 jstack 输出里模糊的 “in Object.wait()” 这类描述——它们不直接显示 State 枚举值。最可靠的方式是代码中调用 Thread.getState()

立即学习Java免费学习笔记(深入)”;

Thread t = new Thread(() -> {
    System.out.println(Thread.currentThread().getState()); // NEW → RUNNABLE
    synchronized (this) {
        System.out.println(Thread.currentThread().getState()); // RUNNABLE(持有锁)
    }
});
t.start();

注意:getState() 返回的是快照,多线程下瞬时状态可能已变。生产环境排查时,更推荐用 jstack <pid>,它输出里明确标注 java.lang.Thread.State: BLOCKEDWAITING (on object monitor)

  • BLOCKED 一定伴随 “waiting to lock <0x...>” 提示,说明卡在 synchronized 入口
  • WAITING 后面若写 “(parking)” 是用了 LockSupport.park();写 “(on object monitor)” 是 Object.wait()
  • TIMED_WAITING 通常来自 Thread.sleep(1000)Object.wait(1000)LockSupport.parkNanos()

状态流转中哪些转换根本不会发生

JVM 规定了严格的状态迁移路径,有些看似合理的跳转实际不可能出现。例如:

社研通
社研通

文科研究生的学术加速器

下载
  • NEWTERMINATED:不可能。没 start 过的线程不能终止,调 thread.stop()(已废弃)也不行
  • RUNNABLENEW:不可能。线程启动后无法重置回初始态
  • BLOCKEDWAITING:不可能。BLOCKED 是锁竞争失败,WAITING 是主动放弃,二者触发机制正交
  • TERMINATED → 任意其他状态:不可能。线程死亡后对象仍存在,但状态永远冻结为 TERMINATED

这些限制不是设计缺陷,而是为了保证线程生命周期可预测。如果你在线程 dump 里看到异常状态组合,大概率是 jstack 抓取时发生了竞态,或者用了非标准线程实现(如某些协程库伪装成 Thread)。

为什么 wait() 后是 WAITING,而 sleep() 后是 TIMED_WAITING

关键区别在于是否依赖“外部唤醒”。Object.wait() 必须配对 notify()notifyAll() 才能返回,JVM 认为它“无限期等待信号”,归入 WAITING;而 Thread.sleep(5000) 自带超时,时间一到自动恢复,所以是 TIMED_WAITING

这个区分直接影响监控逻辑:Prometheus 的 thread_state_count 指标会分别统计两类等待数。如果发现 WAITING 线程持续增长,优先查是否有 wait() 没配 notify();如果是 TIMED_WAITING 异常多,再看是不是定时任务堆积或超时设置过长。

顺带一提:LockSupport.park() 默认进 WAITING,但 parkNanos(1000)TIMED_WAITING——和 sleep 逻辑一致,只是底层机制不同。

状态本身不消耗资源,但长期停留在 WAITINGBLOCKED 往往暴露了锁设计或协作逻辑的问题。真正难定位的,是那些反复在 RUNNABLEWAITING 之间快速切换的线程——它们可能正陷在自旋+阻塞混合的等待策略里,得结合堆栈和 GC 日志一起看。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

786

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

379

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

31

2026.01.21

minimax入口地址汇总
minimax入口地址汇总

本专题整合了minimax相关入口合集,阅读专题下面的文章了解更多详细地址。

2

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.5万人学习

C# 教程
C# 教程

共94课时 | 11.5万人学习

Java 教程
Java 教程

共578课时 | 83.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号