【图解】透彻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,一经查实,立即删除!

相关文章

Java Byte类的hashCode()方法及示例

短类hashCode()方法 (Short class hashCode() method) hashCode() method is available in java.lang package. hashCode()方法在java.lang包中可用。 hashCode() method is used to return hashcode of the Byte object. hashCode()方法用于返回Byte对象的哈希码。 hashCode()…

CentOS7安装Hadoop2.7完整流程

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

获取外网IP地址API

1、获取外网IP地址 地址: http://pv.sohu.com/cityjson?ieutf-8 返回结果: var returnCitySN {"cip": "39.***.***.***", "cid": "370000", "cname": "山东省"};2、获取IP地址详细信…

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

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

java中intvalue_Java Byte类intValue()方法的示例

java中intvalue字节类intValue()方法 (Byte class intValue() method) intValue() method is available in java.lang package. intValue()方法在java.lang包中可用。 intValue() method is used to return the value denoted by this Byte object converted to type int (by c…

python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般会看到以下几种格式的文件: msi, egg, whlmsi文件:Windows系统的安装包, 在Window…

Java BigDecimal toString()方法与示例

BigDecimal类toString()方法 (BigDecimal Class toString() method) toString() method is available in java.math package. toString()方法在java.math包中可用。 toString() method is used to represent string denotation of this BigDecimal with the help of scientific…

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

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

centos6中三台物理机配置nginx+keepalived+lvs

以下只是简单的安装配置,并没有测试这套负载,各种参数大家可以自己测试vip:10.0.50.170lvs server:10.0.50.183real server:10.0.50.184/185183/184/185同步时间,并且安装nginx# ntpdate time.nist.gov# yu…

python整数转换字符串_Python | 将字符串转换为整数列表

python整数转换字符串Given a string with digits and we have to convert the string to its equivalent list of the integers in Python. 给定一个带有数字的字符串,我们必须将该字符串转换为Python中与之等效的整数列表。 Example: 例: Input:str1…

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

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

android开发,设置listview的高度无效

一般是在item的layout中设置高度 android:layout_height"100dp" 但是发现这样后无效,因此找到解决办法,如下: android:minHeight"100dp"

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

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

duration java_Java Duration类| ofDays()方法与示例

duration java持续时间Class ofDays()方法 (Duration Class ofDays() method) ofDays() method is available in java.time package. ofDays()方法在java.time包中可用。 ofDays() method is used to represent the given number of days in this Duration. ofDays()方法用于表…

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

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

java的equals方法_Java Duration类| 带示例的equals()方法

java的equals方法持续时间类equals()方法 (Duration Class equals() method) equals() method is available in java.time package. equals()方法在java.time包中可用。 equals() method is used to identifies whether this Duration and the given object are equal or not. …

ubuntu双系统导致进windows花屏

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

stl resize函数_vector :: resize()函数以及C ++ STL中的示例

stl resize函数C vector :: resize()函数 (C vector::resize() function) vector::resize() is a library function of "vector" header, it is used to resize the vector, it accepts the updated number of elements and a default value (optional) and resizes…

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

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

MFC属性页对话框

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