本篇属于【Java多线程系列】文章第二章【多线程编程的实现与应用】的第二小节内容,我们会来学习线程的生命周期,作为面试的常见问题,我们必须对它有比较好的理解,同时也是后续知识学习的前提条件。
线程的生命周期一共分为五个部分,分别是:新建,就绪,运行,阻塞以及终止。由于CPU需要在多条线程中切换因此线程状态也会在多次运行和阻塞之间切换
新建(New)
当程序使用new关键字创建了一个线程之后,该线程就处于一个新建状态(初始状态),此时它和其他Java对象一样,仅仅由Java虚拟机为其分配了内存,并初始化了其成员变量值。此时的线程对象没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体。
就绪(Runnable)
当线程对象调用了Thread.start()方法之后,该线程处于就绪状态,Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态的线程并没有开始运行,它只是表示该线程可以运行了。
从start()源码中看出,start后添加到了线程列表中,接着在native层添加到VM中,至于该线程何时开始运行,取决于JVM里线程调度器的调度,如果OS调度选中了,就会进入到运行状态。
运行(Running)
如果处于就绪状态的线程获得了CPU资源,就开始执行run方法的线程执行体,则该线程处于运行状态。run方法在哪里呢?其实run也是在native线程中。
阻塞(Blocked)
线程因为某种原因放弃CPU使用权,暂时停止运行。这个状态下是不能分配CPU执行的。
可能会发生的几种情况:
(1)调用了sleep, wait 方法;
(2)进行 IO 阻塞操作,如监听system.in,但没有收到键盘的输入;
(3)获取某个锁的释放,而被加入该锁的阻塞队列中
终止(Terminated)
Terminated状态,就意味着这个线程生命的终结,哪些情况下,线程会进入到Terminated状态呢?
(1)run()方法执行完成,线程正常结束 ;
(2)线程运行过程中出现了意外的错误 ;
(3)JVM 异常结束,所有的线程生命周期均被结束;
(4)调用 stop() 方法;
本文系【程序因子】版权作品,未经授权严禁转载,同时也欢关注同名公众号【程序因子】迎投稿及合作。