Java线程的生命周期的五种状态

前面在《有关Java多线程的几个概念》(https://blog.csdn.net/helloworldchina/article/details/128753898)讲述了Java线程的生命周期的五种状态。在这里再详述一下线程的5种状态。

在java中,任何对象都要有生命周期,线程也一样,它也有自己的生命周期。当Thread对象创建完成时,线程的生命周期便开始了,当run()方法中代码正常执行完毕或者线程抛出一个未捕获的异常(Exception)或者错误(Error)时,线程的生命周期便会结束。线程的整个生命周期可以分为5个状态,分别是新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated),线程的不同状态表明了线程当前正在进行的活动。在程序中,通过一些操作可以使线程在不同状态之间转换,如下图:
在这里插入图片描述

上图中展示了线程各种状态的转换关系,箭头表示可转换的方向,其中,单箭头表示状态是单向的转换,例如,线程从新建状态转换到就绪状态;双箭头表示两种状态可以互相转换,例如,就绪和运行可以互相转换。接下来针对线程生命周期中的五种状态分别进行详细讲解,具体如下。

  1. 新建状态(New)

创建一个线程对象后,还没调用start,就是新建状态。该线程对象就处于新建状态,此时它不能运行,仅仅由Java虚拟机为其分配了内存。

  1. 就绪状态(Runnable)

当线程对象调用了start()方法后,该线程就进入就绪状态。此时,线程不会立即运行,需要等待获取CPU资源。

  1. 运行状态(Running)

如果处于就绪状态的线程获得了CPU的使用权,并开始执行run()方法中的线程执行体,则该线程处于运行状态。一个线程启动后,它可能不会一直处于运行状态,当运行状态的线程使用完系统分配的时间后,系统就会剥夺该线程占用的CPU资源,让其他线程获得执行的机会。需要注意的是,只有处于就绪状态的线程才可能转换到运行状态。

4.阻塞状态(Blocked)

一个正在执行的线程在某些特殊情况下,会让出CPU的使用权并暂时中止自己的执行,进入阻塞状态。线程进入阻塞状态后,就不能进入就绪状态。只有当引起阻塞的原因被消除后,线程才可以转入就绪状态。

注1:当遇到以下几种情况,线程会从运行状态进入到阻塞状态。

1)调用sleep方法,使线程睡眠;

2)调用wait方法,使线程进入等待;

3)当线程去获取同步锁的时候,锁正在被其他线程持有;

4)调用阻塞式IO方法时会导致线程阻塞;

5)调用suspend方法,挂起线程,也会造成阻塞;

注2:线程从阻塞状态只能进入就绪状态,不能直接进入运行状态。因为,从就绪状态到运行状态的切换是不受线程自己控制的,而是由线程调度器所决定。只有当线程获得了CPU时间片之后,才会进入运行状态。

5.死亡状态(Terminated)

当run()方法正常执行完毕或线程调用stop()方法(此方法已经被弃用),或者线程抛出异常(Exception)、错误(Error),线程就进入死亡状态。一旦进入死亡状态,线程将不再拥有运行的资格,也不能再转换到其它状态。

猜你喜欢

转载自blog.csdn.net/helloworldchina/article/details/128762932