Java线程状态及转换
推荐:Java并发编程汇总
Java线程状态及转换
原文地址
Java线程状态和关闭线程的正确姿势
正文
Java中的线程有六种状态,使用Thread类中的枚举类来实现,如下,我对每个状态都进行了一定的解释。
public enum State {/** 表示一个线程还没启用(即未调用start方法)*/NEW,/*** JVM中执行的线程都是处于这个状态的,但是处于这个状态不一定在JVM中执行,* 也就是说,只有这个状态有资格被JVM调度从而获得时间片执行。*/RUNNABLE,/*** 线程在等待获取锁资源从而进入阻塞状态,* 在这个状态中,其一直监视锁的动态,随时准备抢占锁* 若获得锁资源,重新进入RUNNABLE状态*/BLOCKED,/*** 当调用Object.wait、Thread.join或者LockSupport类的park方法的时候,线程进入此状态,* 该状态若无其他线程主动唤醒,则无期限的等待。* 唤醒的方法包括:Object.notify(唤醒随机一个)、Object.notifyAll(唤醒全部线程),* 被唤醒的线程重新进入RUNNABLE状态*/WAITING,/*** 同WAITING状态,不过不同的是调用的方法加上了时间的限制,* 例如:Object.wait(10)、Thread.sleep(10)、Thread.join(10)、LockSupport.parkNanos(10)、LockSupport.parkUntil(10)这些方法* 唤醒的方法有两种:* 1、时间过期。* 2、其他线程调用了notify或者notifyAll* 唤醒之后同样进入RUNNABLE状态*/TIMED_WAITING,/** 线程的终点(正常死亡或者被终止)*/TERMINATED;}
除了NEW和TERMINATED之外,其他的状态都是可以相互转换的,其转换过程如下图所示:
这里特别讲一下RUNNABLE状态,在这个状态中线程并不一定在执行程序,只有被JVM调度的线程才能获得执行的时间片,并且只有这个状态的线程才能够获得时间片,换句话说,被JVM调度并且获得时间片是只属于处于RUNNABLE状态线程的权利。为了便于理解,可以将RUNNABLE分成Runnable
和Running
两个状态(当然,你也可以换成其他的,这里我只是自己好理解),那么上面的线程转换图就转变成了下面这样(参考《Java并发编程的艺术》中的线程状态图):
关于线程状态转换的例子,可以通过下面的代码加深理解。
public class Test {public static void main(String[] args) {Test test = new Test();// 1.NEW状态Thread thread = new Thread(() -> {// 3.进行test对象锁的争夺,若抢到锁则继续执行,否则进入BLOCKED状态监控该锁,重新获得后进入RUNNABLE synchronized (test) {try {// 4.进入TIMED_WAITING状态,100ms后重新进入RUNNABLE状态争夺时间片 Thread.sleep(100);// 5.重新获得时间片之后,进入WAITING状态 test.wait();} catch (InterruptedException e) {e.printStackTrace();}}// 6.正常run()方法执行完毕后线程结束,进入TERMINATED });// 2.调用start()方法,线程进入RUNNABLE状态thread.start();}
}
Java线程状态及转换相关推荐
- Java线程状态及其转换
Java线程的状态及转换 线程状态及其转换 线程的状态 详细介绍: 新建状态(NEW): 就绪状态(RUNNABLE): 运行状态(RUNNING): 阻塞状态(BLOCKED): 等待状态(WAIT ...
- Java线程状态及 wait、sleep、join、interrupt、yield等的区别
Java中的线程状态(详见Java线程状态及转换-MarchOn): wait:Object类的实例方法,释放CPU执行权,进入等待状态,直到 被中断.被拥有该对象锁的线程唤醒(notify或not ...
- java线程切换 notify_浅谈 Java线程状态转换及控制
作者:城北有个混子 出自:博客园 1.线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞( ...
- 【图解】透彻Java线程状态转换
大家好,我是阿星,好久不见,欢迎来到Java并发编程系列番外篇线程状态转换,内容通俗易懂,请放心食用. 线程状态 先来个开场四连问 Java线程状态有几个? Java线程状态是如何转换? Java线程 ...
- JAVA线程状态的10种转换
JAVA线程状态转换 参考视频:https://www.bilibili.com/video/BV16J411h7Rd 后续将继续补充,同时完善. 情况1NEW–>RUNNABLE 当调用t ...
- 面试必备,Java线程状态之细节回顾
点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:https://dwz.cn/vYqjShos Java线程有6种状态 在某个给定时间点 ...
- java线程状态——java线程状态图
java线程状态图,网上有很多资源,无外乎两种,如下: 图一 图二 图二是比较多的,可以看出来我贴出的链接这个博主挺有心的,还把右下角的水印给抹去了,赤裸裸的伪原创心理呀. 还有几张图说的也挺不错的, ...
- java线程状态和状态切换
背景 先来探讨一个关于多线程的基础知识:java线程有多少种状态?根据JDK定义,答案是六种!为什么很多人给出的答案却是五种呢?这极有可能是将操作系统层面的线程状态和java线程状态混为一潭了.因为, ...
- 【Java多线程】Java线程状态及转换方法详解
文章目录 1. 现代操作系统中的线程状态及转换(5种) 2. Java 线程状态(6种) 2.1 NEW 创建 2.2 RUNNABLE 运行 2.3 BLOCKED 阻塞 2.4 WAITING 等 ...
最新文章
- 15 个 JavaScript Web UI 库
- 2021深度学习的研究方向推荐!Transformer、Self-Supervised、Zero-Shot和多模态
- 微软MSRA成立理论中心,陈卫负责马志明等四院士加盟
- 2020年高等数学方法与提高(上海理工大学)学习笔记:无穷级数
- DL之NIN:Network in Network算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- 【人物】互联网教父KK:对未来要有自信,未来是我们的
- 【转】ASP.NET内幕 - IIS处理模型
- python 10个100以内随机整数编辑_你要偷偷的学Python,然后惊呆所有人(第五天) - python阿喵
- 微软ping程序源代码完整版(附详细的注释)
- 在CentOS 7上安装并配置Python 3.6环境
- C#LeetCode刷题之#59-螺旋矩阵 II(Spiral Matrix II)
- fiddler实现将http请求的js转为本地的js文件
- OFDM中的DC subcarrier
- oracle 安装raid卡驱动,centos安装raid卡驱动总结
- 计算机辅助logo设计与实现,新手都会看的logo设计师53条规则
- 原函数的导数与反函数的导数互为倒数
- 简单谈谈我所理解的货币发展史
- iPhone全部设备分辨率速查
- 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析
- PC端和移动端自适应问题解决方法