基于操作系统层面来讲,五种状态
- 【初始状态】仅是在语言层面创建了线程对象,还未与操作系统相关联
- 即java中创建了对象,还未start()开始做个线程
- 【可运行状态】指该线程已经被创建(与操作系统线程关联),可以由CPU调度执行
- 就绪状态,只要被分配时间片就可以被运行
- 【运行状态】指获取了CPU时间片运行中的状态
- 当CPU时间片用完,会从【运行状态】转换为【可运行状态】,会导致线程的上下文切换
- 【阻塞状态】
- 如果调用了阻塞API,如BIO读写文件,这时该线程实际不会用到CPU,会导致线程上下文切换,进入【阻塞状态】。
- 等BIO操作完毕,会由操作系统唤醒阻塞的线程,转换至【可运行状态】。
- 与【可运行状态】的区别是,对【阻塞状态】的线程来说,只要它们一直不唤醒。调度器就一直不会考虑他们。
- 【终止状态】表示线程已经执行完毕,生命周期已经结束了,不会再转换为其他形态。
基于JavaAPI来讲,六种状态
基于Java中的Thraed中的枚举类中的六种
- NEW 线程刚被创建,但是还没有调用start()方法,同操作系统中的【初始状态】
- RUNNABLE 当调用了 start() 方法之后,注意,JAVA API层面的 RUNNABLE 状态涵盖了操作系统层面的【可运行状态】、【运行状态】和【阻塞状态】(由于BIO导致的线程阻塞,在Java 中无法区分,仍然认为是可运行)
- TERMINATED 当代码代码运行结束,同操作系统中的【终止状态】
- BLOCKED、WAITING、TIMED_WATING 都是 JAVA API 层面对【阻塞状态】的细分。
NEW状态
RUNNABLE状态
既有可能分到了时间片,也有可能没有分配到时间片,也有可能处于操作系统的【阻塞状态】
TERMINATED状态
TIMED_WAITING状态
有时限的等待
WAITING状态
等待,没有实现
此处是等待t2线程运行结束,而线程t2是while(true)
BLOCKED 状态
此时t4线程已经加了锁了,并且一直没有释放锁,现在t6和t4来抢锁,会陷入blocked状态,等待t4线程释放锁。