当线程别创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建、就绪、运行、阻塞和死亡。

Java多线程——线程的生命周期(新建、就绪、运行、阻塞、死亡)_就绪状态

1、新建状态:

当程序使用new关键字创建一个线程之后,该线程就处于新建状态,此时它和其他的Java对象一样,仅仅由Java虚拟机与其分配内存,并初始化其成员变量的值,此时线程对象没有表现出任何线程的动态特征,程序也不会执行线程的执行体。

 

2、就绪状态:

当线程对象调用了start()方法之后,该线程处于就绪状态,,Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是便是该线程可以运行了。

 

3、运行状态

一个处理器(CPU),在同一时间,只能处理一个任务。

当一个线程获得了CPU,开始执行run()方法的线程执行体,则该线程处于运行状态。

线程怎么获得CPU呢?线程调度的细节取决于底层平台所采用的策略。对于采用抢占式策略的系统而言,系统会给每个可执行的线程一个小时间段来处理任务;当该时间段用完后,系统就会剥夺该线程所占用的资源,让其他线程获得执行的机会。在选择下一个线程时,系统会考虑线程的优先级。

 

下列情况,运行状态的线程将会进入阻塞状态:

线程调用sleep()方法主动放弃所占用的处理器资源;

线程调用了一个阻塞式IO方法,在该方法返回之前,该线程被阻塞;

线城试图获得一个同步监视器,但该同步监视器正被其他线程所持有;

线程的等待某个通知;

程序调用了线程的suspend()方法将该线程挂起。但该方法容易死锁;

 

4、阻塞状态

下列情况,阻塞状态的线程会进入就绪状态:

调用sleep()的方法的线程经过了指定时间;

线程调用的阻塞式IO方法已经返回;

线程成功地获得了试图取得同步监视器;

线程正在等待某个通知时,其他线程发出了一个通知;

处于挂起(suspend())的线程被调用了resume()恢复方法;

 

5、线程死亡

如下三种方式线程死亡:

run()或call()方法执行完成,线程正常结束;

线程抛出一个未捕获的Exception或Error;

直接调用该线程的stop()方法来结束该线程——该方法容易导致死锁,不推荐;

 

下面说一下,这五种状态的关系:

1、新建状态执行start()之后,变成就绪状态;

2、就绪状态获得CPU,变成运行状态;

3、运行状态:

  • 如果被阻塞,变成阻塞状态;
  • 如果失去处理器资源或者yield(),变成就绪状态;
  • 如果执行完或者stop()或者run(),变成死亡状态;

4、阻塞状态满足解除阻塞状态的条件,变成就绪状态;

5、死亡状态,变成。。。。。。已经死亡了,不会变成什么了。

 

更多内容请关注微信公众号“外里科技

官方公众号

外里科技

运营公众号

英雄赚





开源代码

https://gitee.com/B_T/beimi

Java多线程——线程的生命周期(新建、就绪、运行、阻塞、死亡)_Java多线程_02