【摘要】 线程生命周期
结尾有彩蛋哦
多线程常见面试问题
调用new方法创建线程时,线程就创建了吗?调用start方法后,线程就被执行了吗?线程是能从BLOCKED状态直接进入RUNNING状态吗?线程可以从TERMINATED状态转换为其他状态吗?
线程生命周期状态转化图根据线程的生命周期,可以分为5个状态,但是如果从编程角度分析:有另一个版本的…
线程生命周期
结尾有
彩蛋
哦
多线程常见面试问题
- 调用
new
方法创建线程时,线程就创建了吗? - 调用
start
方法后,线程就被执行了吗? - 线程是能从
BLOCKED
状态直接进入RUNNING
状态吗? - 线程可以从
TERMINATED
状态转换为其他状态吗?
线程生命周期状态转化图
根据线程的生命周期,可以分为5个状态,但是如果从编程角度分析:有另一个版本的线程状态分类
- NEW(创建状态)
- RUNNABLE(可执行状态)
- RUNNING(执行状态)
- BLOCKED(阻塞状态)
- TERMINATED(死亡状态)
NEW(创建)状态
当使用new
关键字创建一个线程对象时,此时线程并不是可执行状态,因为这时候还没有调用start
方法,这个时候的线程处于NEW
状态。
此时线程是不存在的
,对,这个时候应该说只是创建了一个线程对象,并没有创建线程(第一个问题答案)。
NEW
状态的线程只可以通过start
方法进入RUNNABLE
状态,只能进入RUNNABLE
状态,不能进入RUNNING
状态(实际上RUNNING
状态可以看成一种特殊的RUNNABLE
状态)。
RUNNABLE(可执行)状态
通过调用start方法线程对象进入RUNNABLE
状态,这个时候JVM
才会正在的去创建线程,但是此时线程没有被立即执行,或者说不能被立即执行(第二个问题答案)。线程是否被执行取决于能否得到CPU的调度,
也是由于这个原因,线程无法从new状态直接进入RUNNING
状态,即便得到调度的时间很短。
另外,RUNNABLE
状态的线程是不能直接进入BLOCKED
状态的。
排除意外终止
的情况,RUNNABLE
状态的线程只能进入RUNNING
状态。原因很简单,即便我们调用了wait
,sleep
或者其他的线程操作,这些操作也必须得到CPU调度才能生效,一旦线程得到CPU调度,线程的状态也就从RUNNABLE
转换为了RUNNING
。
RUNNING(执行)状态
一旦CPU从任务的可执行队列里选中了线程,线程这时候就转换为了RUNNING状态,也是这时候才开始执行自己的逻辑代码(包括wait,sleep等方法)。
RUNNING状态的线程可以发生如下几种情况的转换:
- 主动进入
BLOCKED
状态,例如:通过调用sleep
或者wait
方法,线程被加入到waitSet
中。 - 被动进入
BLOCKED
状态,例如:获取锁资源,或者遇到阻塞IO操作等 - 进入
TERMINATED
状态,例如:调用了stop
方法(该方法已经不推荐使用)或者意外中断。 - 主动进入
RUNNABLE
状态,调用yield方法放弃CPU的执行权。 - 被动进入
RUNNABLE
状态,CPU调度器放弃了该线程的执行权。
这个队列就是
ThreadGroup
,它非常重要
说到这个
waitSet
,上面说如果按照编程角度来看,还有其他的一种为线程分类的方式,而在waitSet
中的线程在那种分类方式中叫Timed Waiting(限期等待)
BLOCKED(阻塞)状态
上面已经阐述了线程如何进入BLOCKED状态,接下来就聊一下线程可以从BLOCKED状态切换到哪些状态:
- 进入
TERMINATED
状态,例如:调用了stop
方法(该方法已经不推荐使用)或者意外中断(例如:JVM Crash导致所有线程结束)。 - 线程阻塞操作结束,进入
RUNABLE
状态。 - 线程休眠结束,进入
RUNNABLE
状态 - wait 中的线程被其他线程调用
notify
或notifyall
唤醒,进入RUNNABLE
状态 - 线程得到锁资源,进入
RUNNABLE
状态。 - 其他线程调用了
interrup
t方法,线程进入RUNNABLE
状态
线程是不能从
BLOCKED
状态直接进入RUNNING
状态的。(问题3)
TERMINATED(终止)状态
先回答一下上面第四个的问题,线程是不能从TERMINATED
状态转换为其他状态的。TERMINATED
是线程的最终状态,线程进入该状态意味着线程的整个生命周期结束。
彩蛋
超神学院语录
我心存彦,吾彦永恒
留下一个问题:
Thread中的start和run方法是什么关系?
文章来源: blog.csdn.net,作者:keep-go-on,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq_26462567/article/details/115861819