JUC-线程基础(3)

104 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

线程状态

线程状态从两个角度观察,分为五种状态(操作系统角度)和六种状态(JavaAPI角度)

【初始状态】 仅是在语言层面创建了线程对象,还未与操作系统的线程进行关联

【可运行状态】 执行start之后(就绪状态) 指该线程已经被创建(与操作系统线程关联),可以由 CPU 调度执行

【运行状态】 指获取了 CPU 时间片运行中的状态

  • 当 CPU 时间片用完,会从【运行状态】转换至【可运行状态】,会导致线程的上下文切换

【阻塞状态】

有两种情况会进入阻塞:

  1. 读取文件:

    • 如果调用了阻塞 API,如 BIO 读写文件,这时该线程实际不会用到 CPU,会导致线程上下文切换,进入 【阻塞状态】
    • 等 BIO 操作完毕,会由操作系统唤醒阻塞的线程,转换至【可运行状态】
    • 与【可运行状态】的区别是,对【阻塞状态】的线程来说只要它们一直不唤醒,调度器就一直不会考虑 调度它们
  2. 被notify/ interrupt 唤醒然后进行竞争锁,竞争失败者

【终止状态】 表示线程已经执行完毕,生命周期已经结束,不会再转换为其它状态

从操作系统层面,线程可分为三种状态,分别是:NEW、RUNNABLE、TERMINATED

  • NEW 线程刚被创建,但是还没有调用 start() 方法
  • RUNNABLE 当调用了 start() 方法之后,注意,Java API 层面的 RUNNABLE 状态涵盖了 操作系统 层面的 【可运行状态】、【运行状态】和【阻塞状态】(由于 BIO 导致的线程阻塞,在 Java 里无法区分,仍然认为 是可运行)
  • BLOCKED , WAITING , TIMED_WAITING 都是 Java API 层面对【阻塞状态】的细分
  • TERMINATED 线程代码运行结束