Java 杂谈Java 并发教程

图解Java线程的生命周期,看完再也不怕面试官问了

2019-04-22  本文已影响1人  插件小屋

文章首发自个人微信公众号: 小哈学Java

https://www.exception.site/java-concurrency/java-concurrency-thread-life-cycle

Java多线程之线程生命周期

在 Java 初中级面试中,关于线程的生命周期可以说是常客了。本文就针对这个问题,通过图文并茂的方式详细说说。

java线程生命周期

结合上图,线程的生命周期大致可分为以下五种状态

一、NEW 状态

NEW 状态表示线程被新建的状态,我们来看一段示例代码:

Thread thread = new Thread(() -> System.out.println("Hello, world !"));

很多人以为当我们在代码中 new 一个 Thread 的时候,就代表着 thread 线程处于 NEW 状态了,实际上是大错大错的!

实际上,只有当我们调用线程 start() 方法之后,该线程才会被创建出来,而不是通过 new 关键字来创建的,new 关键字仅仅是创建了一个普通的 Java 对象而已。


NEW 状态的线程能发生哪些状态转变?

new状态线程能够发生的状态转换

NEW 状态的线程在调用 start() 方法后,进入 RUNNABLE 状态。

二、RUNNABLE 状态

当我们在代码中显式的调用 start() 方法后,JVM 进程会去创建一个新的线程,而此线程不会马上被 CPU 调度运行,进入 RUNNING 状态,这里会有一个中间状态,就是 RUNNABLE 状态,你可以理解为等待被 CPU 调度的状态:

RUNNABLE中间状态

如上图所示,也就是说被创建的出来的线程会从 NEW -> RUNNABLE 状态,等待 CPU 调度,再大白话一点,就是说这种线程具备被执行的资格,但是能否进入进行阶段,还得看 CPU 的脸色说话。


RUNNABLE 状态的线程能发生哪些状态转变?

runnable状态转换

RUNNABLE 状态的线程无法直接进入 BLOCKED 状态和 TERMINATED 状态的。

很多小伙伴这里可能有疑问,为啥呢?

只有处在 RUNNING 状态的线程,换句话说,只有获得 CPU 调度执行权的线程才有资格进入 BLOCKED 状态和 TERMINATED 状态

PS: RUNNABLE 状态的线程要么能被转换成 RUNNING 状态,要么被意外终止(如 kill -9 PID)。

三、RUNNING 状态

当 CPU 调度发生,并任务队列中选中了某个 RUNNABLE 线程时,该线程会进入 RUNNING 执行状态,并且开始调用 run()方法中逻辑代码。


RUNNING 状态的线程能发生哪些状态转变?

RUNNING状态转换

四、BLOCKED 状态

上小节中我们已经讲到了,进入 BLOCKED 原因,这里,我们就直接谈谈 BLOCK 状态的线程能够发生哪些状态改变:

BLOCKED状态转换

五、TERMINATED 状态

TERMINATED 状态是线程的最终状态,处于此状态中的线程不会切换到以上任何状态,一旦线程进入了 TERMINATED 状态,就意味着这个线程生命的终结,没有回头路了。

以下情况下,线程会进入到 TERMINATED 状态:

六、start 方法源码解析,何时调用的 run() 方法?

通过图文,我们了解了线程生命周期的五种状态,接下来,我们来看看 start 方法源码,其实内部的源码非常简单,如下图所示:

start方法内部源码

看到这里,你也许会有个疑问,自己重写的 run 方法是什么时候被调用的呢?源码中也没看到调用啊!!

Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread.

上面这段截自 JDK 官方文档,意思是说:

run 方法是在调用 JNI 方法 start0() 的时候被调用的,被调用后,我们写的逻辑代码才得以被执行。

一些面试中,面试官也会经常问到这个问题:线程的 start 方法和 run 方法有什么区别?

相信看完上面的源码分析,小伙伴们一定可以源码的角度怼回去了!

七、总结

本文中,小哈通过图文的方式解释了线程的五种状态,以及各种状态能够被转换的状态。最后,我们简单看了一下 start()内部源码,知道了 run() 方法何时被执行的。最后,希望看完本文的小伙伴们能有所收获,下期见!

八、Ref

赠送 | 面试&学习福利资源

最近在网上发现一个不错的 PDF 资源《Java 核心面试知识.pdf》分享给大家,不光是面试,学习,你都值得拥有!!!

获取方式: 关注微信公众号: 小哈学Java, 后台回复"资源",既可无套路获取资源链接,下面是目录以及部分截图:

福利资源截图 福利资源截图 福利资源截图 福利资源截图 福利资源截图 福利资源截图 福利资源截图

重要的事情说两遍,获取方式: 关注微信公众号: 小哈学Java, 后台回复"资源",既可无套路获取资源链接 !!!

欢迎关注微信公众号: 小哈学Java

小哈学Java
上一篇下一篇

猜你喜欢

热点阅读