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

www.exception.site/java-concur…

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

java线程生命周期

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

  • NEW - 新建
  • RUNNABLE - 等待被CPU调度
  • RUNNING - 正在运行
  • BLOCKED - 阻塞
  • TERMINATED - 结束

一、NEW 状态

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

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

当我们在代码中 new 一个 Thread 的时候,就代表着 thread 线程处于 NEW 状态了,但是此时该线程还未被操作系统创建出来,只有当我们调用了 start() 方法之后,该线程才会被创建出来。所以准确来说,NEW 状态只是线程对象的状态。


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状态转换
  • 被转换成 TERMINATED 状态,比如调用 stop() 方法;
  • 被转换成 BLOCKED 状态,比如调用了sleep, wait 方法被加入 waitSet 中;
  • 被转换成 BLOCKED 状态,如进行 IO 阻塞操作,如查询数据库进入阻塞状态;
  • 被转换成 BLOCKED 状态,比如获取某个锁的释放,而被加入该锁的阻塞队列中;
  • 该线程的时间片用完,CPU 再次调度,进入 RUNNABLE 状态;
  • 线程主动调用 yield 方法,让出 CPU 资源,进入 RUNNABLE 状态;

四、BLOCKED 状态

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

BLOCKED状态转换
  • 被转换成 TERMINATED 状态,比如调用 stop() 方法,或者是 JVM 意外 Crash;
  • 被转换成 RUNNABLE 状态,阻塞时间结束,比如读取到了数据库的数据后;
  • 完成了指定时间的休眠,进入到 RUNNABLE 状态;
  • 正在 wait 中的线程,被其他线程调用 notify/notifyAll 方法唤醒,进入到 RUNNABLE 状态;
  • 线程获取到了想要的锁资源,进入 RUNNABLE 状态;
  • 线程在阻塞状态下被打断,如其他线程调用了 interrupt 方法,进入到 RUNNABLE 状态;

五、TERMINATED 状态

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

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

  • 线程正常运行结束,生命周期结束;
  • 线程运行过程中出现意外错误;
  • JVM 异常结束,所有的线程生命周期均被结束。

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

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

start方法内部源码
  • :首先,会判断线程的状态是否是 NEW 状态,内部对应的状态标识是个 0,也就是说如果不等于 0,直接抛线程状态异常;
  • :线程在启动后被加入到 ThreadGroup 中;
  • : start0 是最核心的方法了,就是运行状态为 NEW (内部状态标识为 0) 的线程;
  • start0 是个 native 方法,也就是 JNI 方法;

看到这里,你也许会有个疑问,自己重写的 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

  • 《Java高并发编程详解》

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

小哈学Java

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

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

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

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

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

转载于:https://juejin.im/post/5cbd3df6f265da0363454d78

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

  1. 《Java 并发编程实战》—— Java线程的生命周期

    09 | Java线程的生命周期 通用的线程生命周期:初始状态.可运行状态.运行状态.休眠状态和终止状态. 初始状态,指的是线程已经被创建,但是还不允许分配 CPU 执行.这个状态属于编程语言特有的, ...

  2. java线程的生命周期及wait(),notify(),notifyAll()的详解分析

    1.java线程的生命周期     线程是一个动态执行的过程,它也有一个从产生到死亡的过程. (1)生命周期的五种状态 新建(new Thread)     当创建Thread类的一个实例(对象)时, ...

  3. Spring第三天,详解Bean的生命周期,学会后让面试官无话可说!

    点击下方链接回顾往期 不要再说不会Spring了!Spring第一天,学会进大厂! Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官! 今天讲解Spring中Bean的生命周期. ...

  4. mysql 查看表v空间自增涨_面试问烂的 MySQL 查询优化,看完屌打面试官!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 作者:唐立勇 https://segmentfault.com/a/1190000013672421 什么影响了数据库查询速 ...

  5. 面试问烂的 MySQL 查询优化,看完屌打面试官!

    Java大数据修炼之道 优秀的Java技术公众号 作者:唐立勇 https://segmentfault.com/a/1190000013672421 相关阅读 面试问烂的 MySQL 四种隔离级别, ...

  6. 看完这篇,我再也不怕面试官问垃圾收集了

    看完这篇,我再也不怕面试官问垃圾收集了 说在前面:本文的篇幅较长,看本文的时候最好先去上个厕所,先准备好一杯枸杞茶,慢慢品,本文将会讲解三种垃圾收集算法:标记-清除.复制.标记-整理算法,以及各种成熟 ...

  7. 别看是面试问烂的题目,一面试你照样还是不会系列MySQL四种隔离级别,看完吊打面试官!

    别看是面试问烂的题目,一面试你照样还是不会系列MySQL四种隔离级别,看完吊打面试官! 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也 ...

  8. java线程6种状态转换,Java线程的生命周期和各种状态转换详解

    在Java中,任何对象都有生命周期,线程也不例外,它也有自己的生命周期.当Thread对象创建完成时,线程的生命周期便开始了,当线程任务中代码正常执行完毕或者线程抛出一个未捕获的异常(Exceptio ...

  9. java -- 线程的生命周期

    线程的生命周期 1.线程的生命周期线程是一个动态执行的过程,它也有一个从产生到死亡的过程. (1)生命周期的五种状态 新建(new Thread)当创建Thread类的一个实例(对象)时,此线程进入新 ...

最新文章

  1. 美团实习面试:熟悉红黑树是吧?能不能写一下?
  2. Angular 富文本编辑之路的探索
  3. 计算机小键盘 等号,小键盘上的 000 键
  4. PMCAFF产品经理第一课 | 深圳站 现场集锦
  5. Streamy 使用RDBMS
  6. 《Objective-c》Foundation框架 -(NSDate)
  7. 使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数
  8. Django完成异步工具——celery
  9. 【Win 10 应用开发】分析 URI 中的查询字符串
  10. 超市百货电商app移动端原型+通用模块全局规则说明+超市电商后台管理web端原型+超市电商产品原型及需求文档+业务后台(商品管理+广告管理+活动管理)
  11. win7日历加入农历_还是农历更亲切,春节制作一个带农历的日历,欢欢喜喜过新年...
  12. visio业务流程图教学_用visio软件怎样画数据流程图和业务流程图?
  13. 元宇宙8大创业方向:虚拟偶像、数字孪生…
  14. spring boot生成Excel表格 导出/导入
  15. 区块链符号理论:符号方案和符号系统
  16. python控制excel打印_python对excel表格的操作
  17. AUTOCAD——倒角命令、圆角命令
  18. 不可不知道的SEO与SEM术语大全
  19. Excel(WPS)使用VBA,不打开文件情况下提取其他工作簿数据
  20. android ROM设置默认Launcher(主屏幕应用)

热门文章

  1. WinSock服务程序
  2. Airbnb: React Native 从选择到放弃
  3. [Java 并发编程实战] 设计线程安全的类的三个方式(含代码)
  4. 福州大学软工 1715 | K 班 - 启航
  5. bzoj 1598: [Usaco2008 Mar]牛跑步 [k短路 A*] [学习笔记]
  6. 以对象的形式动态获取宽高
  7. SQL Servr 2008空间数据应用系列三:SQL Server 2008空间数据类型
  8. 0自动转型到DBNull.Value引发的错误
  9. Websphere的类加载器以及策略的简单介绍
  10. mybatis-Batch Executor