• 并发与多线程【三】——线程状态转换


    引言

    线程是 JVM 执行任务的最小单元,理解线程的状态转换是理解多线程问题的基础。在 JVM 运行中,线程共有六种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。这些状态对应 Thread.state 枚举类中的状态。

    线程状态转换

    如下图所示,当创建一个线程时,线程处在 NEW 状态,运行 Thread 的 start 方法后,线程进入 RUNNABLE 可运行状态。

    这时,所有可运行状态的线程并不能马上运行,而是需要先进入就绪状态(READY)等待线程调度,如图中间所示的 READY 状态。

    在获取 CPU 之后才能进入运行状态(RUNNING),如图中所示的 RUNNING 状态。

    运行状态可以随着不同条件转换成除 NEW 以外的其他状态。

    如图左侧所示,在运行状态中的线程进入 synchronized 同步块或同步方法时,如果获取锁失败,则会进入 BLOCKED 状态。当获取到锁后,会从 BLOCKED 状态恢复到 READY 状态。

    如图右侧所示,运行中的线程还会进入等待状态,这两个状态一个是有超时时间的等待,例如调用 Object.wait、Thread.join 等;另一个是没有超时的等待,例如调用 Thread.join、LockSupport.park等。这两种状态都可以通过 notify 或 unpark 结束等待状态并恢复到就绪状态。

    最后是线程运行完成结束时,如图中下侧所示,线程状态变成 TERMINATED。

    扩展

    可以参考另一篇带代码的:https://blog.csdn.net/cisco_huang/article/details/87251768

  • 相关阅读:
    编译原理 实例
    lex yacc flex bison
    图解tensorflow 源码分析
    PostgreSQL 179个场景 案例集锦
    github view source
    Java 微服务实践
    Linux kernel AIO
    Lex与Yacc学习
    OpenResty 通过 Lua 扩展 NGINX 实现的可伸缩的 Web 平台
    nginx Architecture
  • 原文地址:https://www.cnblogs.com/yadongliang/p/12325584.html
Copyright © 2020-2023  润新知