【图解】透彻Java线程状态转换

大家好,我是阿星,好久不见,欢迎来到Java并发编程系列番外篇线程状态转换,内容通俗易懂,请放心食用。

线程状态

先来个开场四连问

  • Java线程状态有几个?

  • Java线程状态是如何转换?

  • Java线程状态转换什么情况会进入锁的等待队列?

  • Java线程状态转换什么情况会进入锁的同步队列?

一提到Java线程状态,不少读者立马想到线程状态转换图,但细想,印象又不深刻,只记得有那么几个状态。

再要你说出Java线程状态是如何转换的,脑子里可能就如下图一样,已经是一团浆糊了。

别慌,阿星为了帮读者大大们理清楚上面的问题,会一步一步的把线程状态转换图给画出来,让读者大大们真正的理解Java线程状态转换

首先线程的状态可以分为6态或7态,具体状态如下

6态

  • New:新建状态

  • Runnable:可运行状态

  • Terminated:终止状态

  • Waiting:等待状态

  • TimedWaiting:超时等待状态

  • Blocked:阻塞状态

7态

  • New:新建状态

  • Ready:就绪状态

  • Running:运行状态

  • Terminated:终止状态

  • Waiting:等待状态

  • TimedWaiting:超时等待状态

  • Blocked:阻塞状态

其实6态与7态差别不大,只不过7态把Runnable可运行状态,拆解成了Ready就绪状态与Running运行状态。

阿星以7态为例,来逐步讲解它们之间是如何转换的。

新建状态(New)

我们可以通过实现Runnable接口或继承Thread声明一个线程类,new一个实例后,线程就进入了新建状态。

一个刚诞生的线程,处于新建状态。

就绪状态(Ready)

线程对象创建成功后,调用该线程的start()函数,线程进入就绪状态,该状态的线程进入可运行线程池中,等待获取C P U的使用权。

线程表示,我已经准备好了,此时我是就绪状态,快选我吧~

运行状态(Running)

此时线程调度程序正在从可运行线程池中选择一个线程,该线程进入运行状态。

换句话说,线程获取到了C P U时间片。

还没完呢,当线程时间片用完或调用的yield()函数,该线程回到就绪状态。

作为一名运气好的线程,我进入了运行状态,但是运气用完了,我还得回到就绪状态。

终止状态(Terminated)

线程继续运行,直到执行结束或执行过程中因异常意外终止都会使线程进入终止状态。

线程一旦终止,就不能复生,这是不可逆的过程。

线程的人生迎来了终点,可能一帆风顺过完一生,也可能英年早逝令人惋惜。

等待状态(Waiting)

运行状态的线程执行wait()、join()、LockSupport.park()任意函数,该线程进入等待状态。

其中wait()join()函数会让J V M把该线程放入锁等待队列。

处于这种状态的线程不会被分配C P U执行时间,它们要等待被主动唤醒,否则会一直处于等待状态。

如果我们要唤醒线程怎么办呢?

执行LockSupport.unpark(t)函数唤醒指定线程,该线程回到就绪状态。

而通过notify()、notifyAll()、join线程执行完毕方式,会唤醒锁等待队列的线程,出队的线程回到就绪状态。

线程的人生迎来了劫难,听信小人之言,跑去菲律宾做打工,结果被黑工厂扣下,只希望警察叔叔能早日解救我出去。

超时等待状态(Timed waiting)

超时等待与等待状态一样,唯一的区别就是多了超时机制,不会一直等待被其他线程主动唤醒,而是到达指定时间后会自动唤醒

以下函数会触发进入超时等待状态

  • wait(long)

  • join(long)

  • LockSupport.parkNanos(long)

  • LockSupport.parkUtil(long)

  • sleep(long)

其中wait(long)、join(long)函数会让J V M把线程放入锁等待队列。

后面的唤醒剧情就和等待状态如出一辙,就多了超时时间到了,自动唤醒的动作。

从菲律宾回国后的线程,也做起了违法的勾当,最终被警察抓捕,好在只判了5年,熬一熬就可以出来了。

阻塞状态(Blocked)

运行状态的线程获取同步锁失败或发出I/O请求,该线程进入阻塞状态。

如果是获取同步锁失败J V M还会把该线程放入锁的同步队列。

同步锁被释放时,锁的同步队列会出队所有线程,进入就绪状态。

I/O处理完毕时,该线程重新回到就绪状态。

出狱后的线程,后面的人生一直都是磕磕碰碰,就没顺利过,大家要引以为戒。

小结

相信读者大大们跟着阿星的思路来,已经掌握了线程状态的知识,以后面试官问这类问题,也可以吊打一番,最后放一张简化的线程转换图为本文画上句号。

关于我

阿星是一个热爱技术的Java程序猿,公众号  「程序猿阿星」 定期分享有趣有料的精品原创文章!

非常感谢各位小哥哥小姐姐们能看到这里,原创不易,文章有帮助可以关注、点个赞、分享与评论,都是支持(莫要白嫖)!

愿你我都能奔赴在各自想去的路上,我们下篇文章见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7安装Hadoop2.7完整流程

2019独角兽企业重金招聘Python工程师标准>>> 1、环境,3台CentOS7,64位,Hadoop2.7需要64位Linux,CentOS7 Minimal的ISO文件只有600M,操作系统十几分钟就可以安装完成, Master 192.168.0.182 Slav…

如果不这样用,Nacos也有安全问题!

前言配置管理作为软件开发中重要的一环,肩负着连接 代码和环境的职责,能很好的分离开发人员和维护人员的关注点。Nacos 的配置管理功能就很好地满足了云原生应用对于配置管理的需求:既能做到配置和代码分离,也能做到配置的动态…

聊聊Spring事务失效的12种场景,太坑了

前言对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了。在某些业务场景下,如果一个请求中,需要同时写入多张表的数据。为了保证操作的原子性(要么同时成功,要么同时失败),避免数据…

什么是可中断锁?有什么用?怎么实现?

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone在 Java 中有两种锁,一种是内置锁 synchronized,一种是显示锁 Lock,其中 Lock 锁是可中断锁&#xff…

10个经典又容易被人疏忽的JVM面试题

前言整理了10个经典又容易被疏忽的JVM面试题,谢谢阅读,大家加油哈.1. 对象一定分配在堆中吗?有没有了解逃逸分析技术?「对象一定分配在堆中吗?」 不一定的,JVM通过「逃逸分析」,那些逃不出方法的…

面试官:怎么解决MySQL中的死锁问题?

咱们使用 MySQL 大概率上都会遇到死锁问题,这实在是个令人非常头痛的问题。本文将会对死锁进行相应介绍,对常见的死锁案例进行相关分析与探讨,以及如何去尽可能避免死锁给出一些建议。话不多说,开整!什么是死锁死锁是并…

ubuntu双系统导致进windows花屏

2019独角兽企业重金招聘Python工程师标准>>> 5600U的集成显卡,装了ubuntu的双系统,居然导致进win7的时候花屏,度娘狗哥都不得求解 网上很多解决方法都说在启动时加上nomodeset,发现对ubuntu15没用,且失去了…

工作总结:日志打印的15个建议

前言 日志是快速定位问题的好帮手,是撕逼和甩锅的利器!打印好日志非常重要。今天我们来聊聊日志打印的15个好建议~1. 选择恰当的日志级别 常见的日志级别有5种,分别是error、warn、info、debug、trace。日常开发中,我们需要选择恰…

MFC属性页对话框

属性页对话框 分类 分页和引导 类 CPropertyPage-父亲CDialog类别,所谓的属性页或网页对话框。 CPropertySheet-父类是CWnd,称为属性表单。 一个完整的属性页对话框由一个属性表单多个属性页组成。属性页嵌套在属性表单内。 标签式属性页的创建步骤&…

面试官:ConcurrentHashMap为什么放弃了分段锁?

今天我们来讨论一下一个比较经典的面试题就是 ConcurrentHashMap 为什么放弃使用了分段锁,这个面试题阿粉相信很多人肯定觉得有点头疼,因为很少有人在开发中去研究这块的内容,今天阿粉就来给大家讲一下这个 ConcurrentHashMap 为什么在 JDK8 …

C语言函数指针的应用——自制谐波分析软件

文章目录函数指针简介格式介绍颜色头文件计算机仿真使用说明完整代码部分效果图函数指针简介 如果在一个大型C语言程序中要反复调用函数,而调用的函数又不明确时,函数指针就是一个非常有用的东西。如果你的函数体内可以传递不同的函数,那就非…

PHP5.5四种序列化性能对比

2019独角兽企业重金招聘Python工程师标准>>> 结论: 1、小数组用msgpack,无论空间和性能都最好 2、大数组,考虑空间用igbinary,考虑性能用msgpack json_encode,serialize,igbinary,msgpack四种序列化方式&am…

MyBatis Plus 批量数据插入功能,yyds!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone最近 Review 小伙伴代码的时候,发现了一个小小的问题,小伙伴竟然在 for 循环中进行了 insert (插入&a…

C语言打印彩色字符——以(枚举法+字符串查找)为例展示

文章目录C语言颜色头文件——自制非常简单的调用函数实战演练——一个基础的枚举变量小程序牛刀小试——查找字符小程序C语言颜色头文件——自制非常简单的调用函数 显然,C语言是不会提供打印彩色字符的标准函数,而我们有时候为了强调C语言打印的部分字…

再见 Spring Task,这个定时任务框架真香!

最近有朋友问到定时任务相关的问题。于是,我简单写了一篇文章总结一下定时任务的一些概念以及一些常见的定时任务技术选型。希望能对小伙伴们有帮助!个人能力有限。如果文章有任何需要补充/完善/修改的地方,欢迎在评论区指出,共同…

C语言实现动画控制

文章目录原材料说明一场革命原材料 下载原材料网址: https://www.easyx.cn/downloads/ 下载easyx2014冬至版,将lib文件放在编译器默认的lib文件夹,h头文件放在编译器默认的include文件夹即可 说明 C语言可以用系统内部的定时函数sleep和usleep定时(需…

聊聊redis分布式锁的8大坑

前言在分布式系统中,由于redis分布式锁相对于更简单和高效,成为了分布式锁的首先,被我们用到了很多实际业务场景当中。但不是说用了redis分布式锁,就可以高枕无忧了,如果没有用好或者用对,也会引来一些意想…

MyBatis 批量插入数据的 3 种方法!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone批量插入功能是我们日常工作中比较常见的业务功能之一,之前我也写过一篇关于《MyBatis Plus 批量数据插入功能,yy…

MongoDB: The Definitive Guide

第一章 简介 MongoDB是面向文档的数据库,不是关系型数据库。内置对MapReduce的支持,以及对地理空间索引的支持。 丰富的数据模型容易扩展,它所采用的面向文档的数据模型可以使其在多台服务器之间分割数据丰富的功能,索引、存储Jav…

Python联网下载文件

声明 Python版本2.7.3所需Py文件——urllib22.7.3版本的Python Shell即可直接执行,但需要联网若程序执行成功,则会下载以下网址的txt文本并打印在shell中 http://helloworldbook2.com/data/message.txt 本代码来源于《父与子的编程之旅——与小卡特一起…