【图解】透彻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
程序猿,公众号 「程序猿阿星」 定期分享有趣有料的精品原创文章!
非常感谢各位小哥哥小姐姐们能看到这里,原创不易,文章有帮助可以关注、点个赞、分享与评论,都是支持(莫要白嫖)!
愿你我都能奔赴在各自想去的路上,我们下篇文章见。
【图解】透彻Java线程状态转换相关推荐
- java线程切换 notify_浅谈 Java线程状态转换及控制
作者:城北有个混子 出自:博客园 1.线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞( ...
- java线程主要状态及转换_Java线程状态转换及控制
线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)这五 ...
- JAVA线程状态的10种转换
JAVA线程状态转换 参考视频:https://www.bilibili.com/video/BV16J411h7Rd 后续将继续补充,同时完善. 情况1NEW–>RUNNABLE 当调用t ...
- 【Java多线程】Java线程状态及转换方法详解
文章目录 1. 现代操作系统中的线程状态及转换(5种) 2. Java 线程状态(6种) 2.1 NEW 创建 2.2 RUNNABLE 运行 2.3 BLOCKED 阻塞 2.4 WAITING 等 ...
- java 线程状态_关于JAVA线程状态
最近在复习java基础知识,在看到java多线程知识的时候偶然搜到一篇csdn上的博客. 这篇博客上弄了一张描述java线程状态转换的图,如下 看到的第一眼直觉上告诉这图我哪里不太对,于是我就去了的相 ...
- java 线程状态_JAVA线程漫谈:线程状态与状态转换解析
线程使用方式 JDK线程的顶层抽象是Runnable接口,本质上,线程相关的类都是基于Runnable和Thread实现类实现. JDK API级别有不同的创建线程的方式,但本质是还是基于Runnab ...
- Java线程状态及转换
推荐:Java并发编程汇总 Java线程状态及转换 原文地址 Java线程状态和关闭线程的正确姿势 正文 Java中的线程有六种状态,使用Thread类中的枚举类来实现,如下,我对每个状态都进行了一定 ...
- Java并发知识梳理(上):并发优缺点,线程状态转换,Java内存模型,Synchronized,Volatile,final,并发三特性,Lock与AQS,ReetrandLock
努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! 整个系列文章为Java并发专题,一是自己的兴趣,二是,这部分在实际理解上很有难度,另外在面试过程中也是经常被问到.所以在学习过程中,记 ...
- 面试必备,Java线程状态之细节回顾
点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:https://dwz.cn/vYqjShos Java线程有6种状态 在某个给定时间点 ...
最新文章
- 2016年我国研究的超级计算机,盘点2016:我国科研取得的重大成果
- 谷歌日语输入法电脑版_【Win安卓】谷歌地球电脑专业版和手机清爽版
- QT的QDesignerPropertySheetExtension类的使用
- Leet Code OJ 8. String to Integer (atoi) [Difficulty: Easy]
- 微信小程序 - 骨架屏
- 拙见之drawPath()与fillPath
- ORACLE SQL总结六:管理方案对象
- Emulator 29.0.4 Canary 发布,Android 模拟器
- 窥探日志的秘密【华为云分享】
- android中ScrollView和GridView/ListView共存时,ScrollView不在顶部的解决方法
- 计分及竞赛软件启动时的错误现象及解决方法
- IP库GeoLite2-City.mmdb的使用
- 读取xls格式的文件
- 制作u盘winpe启动盘_U盘PE启动盘制作方法
- stm32驱动rgb屏电路图_STM32直接驱动RGB接口的TFT数字彩屏设计
- 神奇的操作,用买家手机号查询顺丰物流信息
- 众至统一安全管理平台GuardIt AllInOne,一站式、轻量化、低成本、快接入
- python读取mt4数据_手把手教你使用Python进行数据获取和作图
- Verilog基本语法之数据类型(二)
- 大专拿不到计算机考证能毕业吗
热门文章
- linux java jar打包_【Java】Java程序打包成jar包在Linux上运行
- cad应用程序的组件中发生了未经处理的异常_什么是CAD/CAM?
- Linux 服务器停止当前运行的程序,实验,代码
- 基于Android的聊天软件,Socket即时通信,实现用户在线聊天
- UVA1583 Digit Generator
- Android手机用wifi连接adb调试的方法
- mikrotik dhcp server
- [CareerCup] 8.10 Implement a Hash Table 实现一个哈希表
- BJRangeSliderWithProgress
- 混乱开发,既伤身体又伤感情