←←←←←←←←←←←← 快!点关注
在 Java 初中级面试中,关于线程的生命周期可以说是常客了。本文就针对这个问题,通过图文并茂的方式详细说说。
结合上图,线程的生命周期大致可分为以下五种状态:
NEW 状态表示线程被新建的状态,我们来看一段示例代码:
Thread thread = new Thread(() -> System.out.println("Hello, world !"));
很多人以为当我们在代码中new
一个Thread
的时候,就代表着thread
线程处于NEW
状态了,实际上是大错大错的!
实际上,只有当我们调用线程start()
方法之后,该线程才会被创建出来,而不是通过new
关键字来创建的,new
关键字仅仅是创建了一个普通的 Java 对象而已。
NEW 状态的线程能发生哪些状态转变?
NEW 状态的线程在调用start()
方法后,进入 RUNNABLE 状态。
当我们在代码中显式的调用start()
方法后,JVM 进程会去创建一个新的线程,而此线程不会马上被 CPU 调度运行,进入 RUNNING 状态,这里会有一个中间状态,就是 RUNNABLE 状态,你可以理解为等待被 CPU 调度的状态:
如上图所示,也就是说被创建的出来的线程会从NEW -> RUNNABLE
状态,等待 CPU 调度,再大白话一点,就是说这种线程具备被执行的资格,但是能否进入进行阶段,还得看 CPU 的脸色说话。
RUNNABLE 状态的线程能发生哪些状态转变?
RUNNABLE 状态的线程无法直接进入 BLOCKED 状态和 TERMINATED 状态的。
很多小伙伴这里可能有疑问,为啥呢?
只有处在 RUNNING 状态的线程,换句话说,只有获得 CPU 调度执行权的线程才有资格进入 BLOCKED 状态和 TERMINATED 状态
PS: RUNNABLE 状态的线程要么能被转换成 RUNNING 状态,要么被意外终止(如 kill -9 PID)。
当 CPU 调度发生,并任务队列中选中了某个 RUNNABLE 线程时,该线程会进入 RUNNING 执行状态,并且开始调用run()
方法中逻辑代码。
RUNNING 状态的线程能发生哪些状态转变?
上小节中我们已经讲到了,进入 BLOCKED 原因,这里,我们就直接谈谈 BLOCK 状态的线程能够发生哪些状态改变:
TERMINATED 状态是线程的最终状态,处于此状态中的线程不会切换到以上任何状态,一旦线程进入了 TERMINATED 状态,就意味着这个线程生命的终结,没有回头路了。
以下情况下,线程会进入到 TERMINATED 状态:
通过图文,我们了解了线程生命周期的五种状态,接下来,我们来看看 start 方法源码,其实内部的源码非常简单,如下图所示:
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() 方法何时被执行的。
分享免费学习资料
针对于Java程序员,我这边准备免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)
为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!
资料领取方式:加入Java技术交流群963944895
,点击加入群聊,私信管理员即可免费领取
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。