Logo

郎哥编程

线程的生命周期

2019-12-31 205

线程从创建到消亡,要经历创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、等待(waiting)、消亡(dead)等若干状态,其中运行、阻塞、等待状态之间会互相转换。

线程创建后,不会立即进入就绪状态,需要等待JVM分配线程运行所必备的资源,如内存资源、运行栈、程序计数器等,所有资源分配完毕后,线程进入就绪状态。

进入就绪的线程,需要等待JVM的调度以获取CPU的时间,对于单核CPU来说,当前时间段只能运行一个线程,如果是多核CPU,可以运行多个线程。线程得到CPU的执行时间后,就进入了运行状态。

进入运行状态的线程,可能会由于多种原因导致线程不能继续运行下去。例如,线程自身进入睡眠状态、或者被其它线程阻塞、或者被JVM调度进入等待状态等。此时就对应着多个状态:time waiting(睡眠或等待一定的事件)、waiting(等待被唤醒)、blocked(阻塞)。

线程执行完毕,JVM会清理线程所使用到的资源,线程进入消亡状态。

线程从创建到消亡状态之间的转换如下图所示:

image.png       

                                      

线程从创建到消亡过程状态转换图

前面说到线程需要轮换使用CPU的时间,当正在运行的线程被JVM切换到另一个线程时,需要记录当前运行线程的运行栈、程序计数器等数据和线程状态,当线程再次被唤醒时,能够保持当前的状态继续执行。这种过程称为线程的上下文切换。

举个例子,假如线程A正在读取文件内容,读到一半时,JVM需要暂停线程A,转去执行线程B,当再次切换回来执行线程A的时候,需要保持线程A读取文件的状态。

对于线程的上下文切换实际上就是存储和恢复CPU状态的过程,它使得线程执行能够从中断点恢复执行。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论