讲师中心 微信公众号
AI工具推荐 视频效率加速

Java中的线程生命周期状态转换_从New到Terminated的完整过程

夏枫君_1817

夏枫君_1817

发布时间:2026-02-22 17:37:40

|

432人浏览过

|

来源于php中文网

原创

Java线程6种状态精确对应JVM调度行为:NEW(未start)、RUNNABLE(可调度,含就绪与运行)、BLOCKED(争抢synchronized锁)、WAITING/TIMED_WAITING(等待唤醒或超时)、TERMINATED(run结束),状态切换受OS和JVM共同影响,非代码完全可控。

java中的线程生命周期状态转换_从new到terminated的完整过程

Java线程的6种状态到底对应什么实际行为

Java线程不是靠“运行中”这种模糊描述判断状态的,Thread.State 的6个枚举值直接映射到JVM线程调度器的真实决策点。比如 WAITING 和 TIMED_WAITING 看似只差一个超时参数,但前者必须依赖其他线程显式唤醒(如 Object.notify()),后者可能自己醒来(如 Thread.sleep(1000)),一旦混淆就容易写出让线程永远卡住的代码。

  • NEW:线程对象已创建,但 start() 还没调用;此时调用 join() 会立即返回,不会阻塞
  • RUNNABLE:不等于“正在CPU上执行”,而是“可被调度”——包括在操作系统就绪队列里排队等待CPU,也包括正在执行字节码
  • BLOCKED:只发生在进入 synchronized 块/方法时抢不到锁,和I/O阻塞、sleep无关;可通过 jstack 看到 “waiting to lock 0x...”
  • WAITING / TIMED_WAITING:由 Object.wait()、Thread.join()、LockSupport.park() 等触发,注意 Thread.sleep() 是 TIMED_WAITING,不是 WAITING
  • TERMINATED:线程 run() 方法正常结束、抛出未捕获异常、或被 stop()(已废弃)终止后进入;此后调用 isAlive() 返回 false,但状态字段仍为 TERMINATED

state == TERMINATED 不代表线程资源已释放

很多人以为线程进入 TERMINATED 状态就万事大吉,其实 JVM 只是标记它结束了,栈帧、本地变量、持有的 monitor 锁(如果有的话)是否清理干净,取决于 GC 是否回收该 Thread 对象本身。常见陷阱是在线程内启动了守护线程、注册了 shutdown hook、或持有静态集合引用,导致线程对象无法被回收,进而让整个线程上下文残留内存。

  • 线程退出后,若它创建的 ThreadLocal 变量没手动 remove(),可能引发内存泄漏——尤其是在线程池复用场景下
  • TERMINATED 线程对象仍可调用 getStackTrace(),但返回空数组;而 getState() 始终返回 TERMINATED,哪怕对象已被 GC 标记
  • 不要依赖 isAlive() == false 来判断“线程彻底消失”,它只说明 run() 已退出;真正要确认资源释放,得看 GC 日志或堆直方图里 java.lang.Thread 实例数是否下降

从 NEW 到 TERMINATED 的转换不是全由代码控制

你写了 thread.start(),但线程未必立刻变成 RUNNABLE;你写了 thread.interrupt(),它也不一定立刻进 TERMINATED。中间穿插着操作系统线程创建开销、JVM 线程调度策略、甚至 GC 暂停的影响。最典型的反直觉点:线程在 RUNNABLE 状态下可能被 OS 调度器长时间挂起,而 JVM 依然认为它是“可运行”的。

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载
  • start() 调用后,JVM 需调用 OS API 创建原生线程,这步失败会导致 IllegalThreadStateException,但状态仍为 NEW
  • 线程在 BLOCKED 或 WAITING 时被中断,会抛出 InterruptedException 并转为 RUNNABLE,而不是直接终结
  • 调用 interrupt() 对 TERMINATED 线程无效,但对 NEW 线程会设置中断标志(isInterrupted() 返回 true),这个标志在 start() 后才可能生效
  • JDK 19+ 引入虚拟线程(Thread.ofVirtual()),其状态机与平台线程不同:NEW → RUNNABLE → TERMINATED 是主路径,没有 BLOCKED/WAITING,因为调度由 JVM 用户态协程调度器接管

调试时别只看 getState(),要结合 jstack 和线程 dump

Thread.getState() 返回的是调用瞬间的快照,而线程状态切换极快。比如一个线程刚打印出 RUNNABLE,下一纳秒可能就因 I/O 进入 WAITING,但你的日志根本抓不到。真正定位问题得靠外部工具给出的全局视角。

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

  • jstack <pid></pid> 输出里,“java.lang.Thread.State: TIMED_WAITING (parking)” 表示它正被 LockSupport.parkNanos() 挂起,不是死锁
  • 看到 “java.lang.Thread.State: BLOCKED (on object monitor)” 且后面跟着 “waiting to lock 0x0000000712345000”,说明它在等某个对象锁,去搜同个地址被谁持有(通常带 “locked ”)
  • 如果线程 dump 里大量线程卡在 sun.misc.Unsafe.park(),大概率是 ForkJoinPool 或 CompletableFuture 内部调度问题,不是业务代码锁竞争
  • 用 jcmd <pid> Thread.print</pid> 比 jstack 更轻量,适合高频采样;但要注意它和目标JVM共享同一信号处理机制,频繁调用可能干扰应用本身
线程状态是 JVM 和操作系统共同维护的视图,不是 Java 代码能完全掌控的抽象。最容易被忽略的是:状态值本身不携带上下文,RUNNABLE 可能正在自旋,WAITING 可能等的是一个永远不会 notify 的对象,而 TERMINATED 的线程对象只要还被引用,就还在占用堆内存。

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

3140

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

269

2026.02.03

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

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

6327

2023.07.18

堆和栈区别
堆和栈区别

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

2648

2023.08.10

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

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

6327

2023.07.18

堆和栈区别
堆和栈区别

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

2648

2023.08.10

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

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

4498

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

563

2025.12.01

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn