当线程别创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建、就绪、运行、阻塞和死亡。
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、死亡状态,变成。。。。。。已经死亡了,不会变成什么了。
更多内容请关注微信公众号“外里科技”
官方公众号 | 外里科技 |
运营公众号 | 英雄赚 |
微信 | wxid_8awklmbh1fzm22 |
1247408032 | |
开源代码 | https://gitee.com/B_T/beimi |