线程的5种状态:

这是从操作系统层面来描述的

1646722438520.png
初始状态:仅在语言层面创建了线程对象,还未与操作系统线程关联

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

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

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

阻塞状态:

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

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


线程的6种状态

根据Thread State枚举类的描述,进行分类

1646723788025.png

NEW:线程刚被创建,但是还没调用start()方法

RUNNABLE:当调用了start()方法之后,java API层面的RUNNABLE状态涵盖了操作系统层面的[可运行状态],

[运行状态]、[阻塞状态](由于BIO导致的线程阻塞,在Java里无法区分,认为是可运行的)

BLOCKED , WAITING , TIMED_WAITING:都是 Java API 层面对【阻塞状态】的细分,后面会在状态转换一节

详述

TERMINATED:当线程代码运行结束