推荐: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分成RunnableRunning两个状态(当然,你也可以换成其他的,这里我只是自己好理解),那么上面的线程转换图就转变成了下面这样(参考《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线程状态及转换相关推荐

  1. Java线程状态及其转换

    Java线程的状态及转换 线程状态及其转换 线程的状态 详细介绍: 新建状态(NEW): 就绪状态(RUNNABLE): 运行状态(RUNNING): 阻塞状态(BLOCKED): 等待状态(WAIT ...

  2. Java线程状态及 wait、sleep、join、interrupt、yield等的区别

    Java中的线程状态(详见Java线程状态及转换-MarchOn): wait:Object类的实例方法,释放CPU执行权,进入等待状态,直到  被中断.被拥有该对象锁的线程唤醒(notify或not ...

  3. java线程切换 notify_浅谈 Java线程状态转换及控制

    作者:城北有个混子 出自:博客园 1.线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞( ...

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

    大家好,我是阿星,好久不见,欢迎来到Java并发编程系列番外篇线程状态转换,内容通俗易懂,请放心食用. 线程状态 先来个开场四连问 Java线程状态有几个? Java线程状态是如何转换? Java线程 ...

  5. JAVA线程状态的10种转换

    JAVA线程状态转换 参考视频:https://www.bilibili.com/video/BV16J411h7Rd 后续将继续补充,同时完善. 情况1NEW–>RUNNABLE ​ 当调用t ...

  6. 面试必备,Java线程状态之细节回顾

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:https://dwz.cn/vYqjShos Java线程有6种状态 在某个给定时间点 ...

  7. java线程状态——java线程状态图

    java线程状态图,网上有很多资源,无外乎两种,如下: 图一 图二 图二是比较多的,可以看出来我贴出的链接这个博主挺有心的,还把右下角的水印给抹去了,赤裸裸的伪原创心理呀. 还有几张图说的也挺不错的, ...

  8. java线程状态和状态切换

    背景 先来探讨一个关于多线程的基础知识:java线程有多少种状态?根据JDK定义,答案是六种!为什么很多人给出的答案却是五种呢?这极有可能是将操作系统层面的线程状态和java线程状态混为一潭了.因为, ...

  9. 【Java多线程】Java线程状态及转换方法详解

    文章目录 1. 现代操作系统中的线程状态及转换(5种) 2. Java 线程状态(6种) 2.1 NEW 创建 2.2 RUNNABLE 运行 2.3 BLOCKED 阻塞 2.4 WAITING 等 ...

最新文章

  1. 15 个 JavaScript Web UI 库
  2. 2021深度学习的研究方向推荐!Transformer、Self-Supervised、Zero-Shot和多模态
  3. 微软MSRA成立理论中心,陈卫负责马志明等四院士加盟
  4. 2020年高等数学方法与提高(上海理工大学)学习笔记:无穷级数
  5. DL之NIN:Network in Network算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  6. 【人物】互联网教父KK:对未来要有自信,未来是我们的
  7. 【转】ASP.NET内幕 - IIS处理模型
  8. python 10个100以内随机整数编辑_你要偷偷的学Python,然后惊呆所有人(第五天) - python阿喵
  9. 微软ping程序源代码完整版(附详细的注释)
  10. 在CentOS 7上安装并配置Python 3.6环境
  11. C#LeetCode刷题之#59-螺旋矩阵 II(Spiral Matrix II)
  12. fiddler实现将http请求的js转为本地的js文件
  13. OFDM中的DC subcarrier
  14. oracle 安装raid卡驱动,centos安装raid卡驱动总结
  15. 计算机辅助logo设计与实现,新手都会看的logo设计师53条规则
  16. 原函数的导数与反函数的导数互为倒数
  17. 简单谈谈我所理解的货币发展史
  18. iPhone全部设备分辨率速查
  19. 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析
  20. PC端和移动端自适应问题解决方法

热门文章

  1. [UVa 1646] Edge Case
  2. 简述API HOOK技术及原理
  3. 基于C++和OpenGL (GLUT) 实现太阳系行星系统
  4. 证件照制作小程序源码下载-超级实用工具
  5. 51单片机用c语言倒计时程序,51单片机实现100以内倒计时,求大佬指点。
  6. RS485为什么需要隔离?什么情况下可以不用隔离?
  7. 485通讯线是几芯的_rs485总线是啥线?rs485总线是几芯线
  8. 归并排序算法(C语言)
  9. C++修改密码恶搞软件通过代码修改电脑密码
  10. mac下mysql修改密码