快乐生活

​Java 线程生命周期:6 大状态详解与开发启示

点击: 来源:快乐生活
摘要:Java 线程生命周期:6 大状态详解与开发启示 Java 线程的生命周期由六个明确的状态构成,每个状态对应着特定的运行场景。理解这些状态对开发多线程程序至关重要,直接影响着程序的

Java 线程生命周期:6 大状态详解与开发启示

Java 线程的生命周期由六个明确的状态构成,每个状态对应着特定的运行场景。理解这些状态对开发多线程程序至关重要,直接影响着程序的性能优化和异常排查效率。以下是各个状态的深度解析:

一、NEW(新建状态)

当通过 new Thread() 创建线程对象但未调用 start() 方法时,线程处于初始状态。此时:

未分配系统资源未建立线程调用栈不可执行状态

典型场景:Thread worker = new Thread(task); 此时 worker 处于 NEW 状态。

二、RUNNABLE(可运行状态)

调用 start() 方法后进入该状态,包含两种子状态:

Ready:等待 CPU 时间片Running:正在执行任务

关键特征:

可能正在运行或等待系统调度不会主动让出 CPU(需配合 yield())I/O 阻塞不会改变此状态

示例:worker.start(); 后线程进入 RUNNABLE 状态池等待调度。

三、BLOCKED(锁阻塞)

当线程试图获取已被其他线程持有的对象锁时进入该状态:

只发生在同步代码块/方法中锁释放后进入 RUNNABLE 状态与 Lock 接口的锁机制不同

场景演示:

java

synchronized(lock) { // 其他线程在此处被阻塞 }

四、WAITING(无限等待)

通过特定方法触发无限期等待:

object.wait() 需配合 notify()/notifyAll()thread.join() 等待目标线程终止LockSupport.park()

重要特征:

需要外部干预才能恢复可能引发线程假死

五、TIMED_WAITING(限期等待)

带超时机制的等待状态:

Thread.sleep(long)object.wait(timeout)thread.join(timeout)

与 WAITING 的区别:

可自动恢复 RUNNABLE 状态需处理 InterruptedException

六、TERMINATED(终止状态)

线程执行结束的最终状态:

run() 方法正常退出未捕获异常导致线程终止不可再次启动(调用 start() 会抛异常)

状态转换全景图

复制

NEW → start() → RUNNABLE RUNNABLE → 获锁失败 → BLOCKED RUNNABLE → wait() → WAITING WAITING → notify() → RUNNABLE RUNNABLE → sleep(1000) → TIMED_WAITING RUNNABLE → run()结束 → TERMINATED

开发实践建议

使用 jstack 或 VisualVM 分析线程状态避免滥用 synchronized 导致过度阻塞优先使用 java.util.concurrent 工具类对 TIMED_WAITING 设置合理超时时间注意处理中断异常保证线程正常退出

理解线程状态转换机制,能够帮助开发者更精准地进行并发控制,避免死锁、线程饥饿等问题,构建高性能的 Java 并发程序。建议结合线程 Dump 分析工具进行实际状态观察,将理论知识与实践验证相结合。

线程转换关系图

相关文章

    ​20日PBE:准备剁手啦 猴年限定皮肤曝光

    ​“伦敦桥倒了”

    ​“伦敦桥倒了”

    ​云赏天府②巴中平昌:秀美山水 绿色家园

    ​云赏天府②巴中平昌:秀美山水 绿色家园

    ​我看《三峡好人》

    ​我看《三峡好人》

    ​塘沽外滩公园

    ​塘沽外滩公园

    ​杭州西湖寺庙之灵顺寺

    ​杭州西湖寺庙之灵顺寺

    ​Darry Ring重庆观音桥店将于1月17号浪漫开业

    ​Darry Ring重庆观音桥店将于1月17号浪漫开业

    ​2024倍耐力年历发布,超模坎贝尔出镜

    ​2024倍耐力年历发布,超模坎贝尔出镜

    ​“金庸家族成员里11位名人”

    ​“金庸家族成员里11位名人”

    ​中国有北京和南京,为什么没有东京和西京?

    ​中国有北京和南京,为什么没有东京和西京?

    ​一年级超实用的拼音学习方法与技巧,建议收藏

    ​一年级超实用的拼音学习方法与技巧,建议收藏