文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

线程有几种状态,状态之间的流转是怎样的?

2024-11-28 14:05

关注

线程的六种状态

  1. NEW(新建状态):

线程在创建后,但还没有调用 start() 方法时,处于 NEW 状态。

线程对象被实例化,但还未开始执行。

  1. RUNNABLE(可运行状态):

线程调用了 start() 方法后,进入 RUNNABLE 状态。

线程可能正在执行(CPU 正在执行该线程),也可能是就绪状态,等待操作系统调度执行。注意:在 Java 中,RUNNABLE 既包括了线程在运行的状态,也包括了线程准备好可以运行但暂时未被操作系统调度的状态。

  1. BLOCKED(阻塞状态):

线程处于 BLOCKED 状态时,表示它正在等待获取某个锁,以便执行接下来的操作。

这种状态通常发生在多个线程竞争同一资源(如锁)时。线程在等待获得锁时被阻塞,直到锁可用。

  1. WAITING(等待状态):

线程调用了 Object.wait()。

线程调用了 Thread.join()(没有指定超时)。

线程调用了 LockSupport.park()。

线程进入 WAITING 状态时,表示它正在等待其他线程的某个操作来唤醒它,且没有设定超时限制。

常见的情况是:

  1. TIMED_WAITING(定时等待状态):

线程调用了 Thread.sleep(milliseconds)。

线程调用了 Object.wait(milliseconds)。

线程调用了 Thread.join(milliseconds)。

线程调用了 LockSupport.parkNanos() 或 LockSupport.parkUntil()。

线程进入 TIMED_WAITING 状态时,表示它正在等待某个条件满足,但等待是有超时限制的。

线程会等待一段时间,超时后会自动被唤醒。

常见的情况是:

  1. TERMINATED(终止状态):

线程在执行完毕后,进入 TERMINATED 状态。

线程的生命周期结束,线程对象不能再被启动。

线程因为正常完成任务,或者由于异常等原因结束时都会进入这个状态。

状态之间的流转

调用 Thread.start() 方法后,线程从 NEW 状态变为 RUNNABLE 状态。

图解

+--------+      start()     +-----------+
  |  NEW   |  ------------>  | RUNNABLE  |
  +--------+                 +-----------+
                               |       |
                           +---+       +---+
                           |                       |
                           v                       v
                    +-----------+          +---------------+
                    |  BLOCKED  |          |  WAITING      |
                    +-----------+          +---------------+
                               |                       |
                           +---+       +---+
                           |           |
                           v           v
                    +-----------------+
                    | TIMED_WAITING   |
                    +-----------------+
                               |
                           +---+
                           |
                           v
                    +-----------+
                    | TERMINATED|
                    +-----------+

总结:

WAITING 和 TIMED_WAITING 的区别?

这两种状态的关键区别是 是否有超时限制,WAITING 没有时间限制,而 TIMED_WAITING 是有超时的。 

为什么线程没有RUNNING状态?

因为它与 RUNNABLE 状态的概念重合。

具体原因:

  1. RUNNABLE 状态包括正在执行和就绪的线程:

在 Java 的线程状态模型中,RUNNABLE 状态既包括了线程已经在 CPU 上执行的状态(实际上正在运行),也包括了线程处于就绪队列中,等待 CPU 分配时间片的状态。

线程一旦被操作系统调度执行,它就进入 RUNNABLE 状态,但这个状态的定义并不区分是否正在执行。操作系统负责将线程从就绪队列中调度到实际的执行状态,并且 Java 并不会对这个过程做细分。

  1. 线程状态模型的设计:

Java 线程状态模型的设计简化了线程的生命周期管理,没有单独为运行中的线程定义一个状态。RUNNABLE 状态作为一个集合状态,能够涵盖线程既可能在执行也可能在等待 CPU 资源的场景。

在操作系统中,线程的调度是由操作系统内核进行的,Java 并不直接控制线程的执行时间或如何选择线程,而是通过 Java 的线程调度器(JVM)委托给操作系统。所以,线程一旦在运行,实际上是 "正在运行" 或 "就绪等待" 都在 RUNNABLE 状态下进行管理。

  1. JVM 调度与操作系统的区别:

线程的生命周期与操作系统的调度密切相关。在 Java 中,线程进入 RUNNABLE 状态意味着它已经准备好由操作系统调度,但操作系统可能会把它从 CPU 上切换出去,导致线程不再“运行”。

JVM 不强制区分 运行中 和 就绪中,因为从 JVM 的角度看,线程要么处于 RUNNABLE 状态,要么因为某种原因(如阻塞、等待等)不再处于运行状态。

来源:架构殿堂内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯