Java线程的状态及转换

  • 线程状态及其转换
    • 线程的状态
      • 详细介绍:
        • 新建状态(NEW):
        • 就绪状态(RUNNABLE):
        • 运行状态(RUNNING):
        • 阻塞状态(BLOCKED):
        • 等待状态(WAITING):
        • 睡眠等待状态(TIMED_WAITING)
        • 终止状态(TERMINATED)
    • 线程状态的转换

线程状态及其转换

线程的状态

线程的状态,在java中是提供了枚举类型的State。

public enum State {NEW,          //创建状态RUNNABLE,     //运行状态BLOCKED,      //阻塞状态WAITING,      //等待状态TIMED_WAITING,    //睡眠等待状态TERMINATED;     //终止状态}

可以看出Java中提供了6种线程状态,但是在操作系统中,常常将RUNNABLE状态,分为以下两种:RUNNABLE:就绪状态,RUNNING:运行状态

因此:可以总结为下面这7种状态:

  • 新建状态:NEW
  • 就绪状态:RUNNABLE
  • 运行状态:RUNNING
  • 阻塞状态:BLOCKED
  • 等待状态:WAITING
  • 睡眠等待状态:TIMED_WAITING
  • 终止状态:TREMINATED

详细介绍:

新建状态(NEW):

  • 用new语句创建的线程处于新建状态,此时和其他对象一样,在堆中仅仅给分配了内存

就绪状态(RUNNABLE):

  • 当一个线程创建后,调用了start方法,线程状态就进入到就绪状态,处于就绪状态的线程意味着所有需要的资源已经装备就绪,等待CPU的调用,CPU的调度是由操作系统控制的,用户是无法操控。

运行状态(RUNNING):

  • 处于运行状态的线程占用CPU资源,执行程序代码。(注:只有处于就绪状态的线程才能有机会进入到运行状态)

阻塞状态(BLOCKED):

  • 进入这种阻塞状态的原因可以是:1.线程期望进入同步方法或者同步代码块(Synchronized)2.尚未获取到锁资源的情况下,可以从运行状态进入到阻塞状态。

等待状态(WAITING):

  • 如果调用wait()方法,就进入到等待状态,即调用wait()会触发线程从运行状态进入到阻塞状态而无法执行,直到其他线程发出notify或notifyAll方法,此时线程才会从等待状态进入到阻塞状态,进而进入就绪状态。(详情结合下图)

睡眠等待状态(TIMED_WAITING)

  • 如果线程调用sleep(long)、join(long)、wait(long)等方法时,会使线程进入到TIMED_WAITING状态,即指定了阻塞的时间。等到达了指定的时间后就可以继续进入就绪状态等待CPU的调度。

终止状态(TERMINATED)

  • 当线程退出run()方法时,线程就进入了终止状态,该状态是线程的生命周期的结束。

线程状态的转换

附图:

看到上面图,我们可以看出,线程状态的转换,有些是依靠我们的线程方法的。方法详解,戳底部链接。

线程必定经过的四个状态:NEW -> RUNNABLE -> RUNNING -> TERMINATED

线程需要资源不足时,会进入阻塞状态:BLOCKED、WAITING、TIME_WAITING


更多有关Java多线程的内容,详戳【Java多线程】,方法详解,戳【线程基础方法】,更多其他内容,详戳主页。

Java线程状态及其转换相关推荐

  1. Java线程状态及转换

    推荐:Java并发编程汇总 Java线程状态及转换 原文地址 Java线程状态和关闭线程的正确姿势 正文 Java中的线程有六种状态,使用Thread类中的枚举类来实现,如下,我对每个状态都进行了一定 ...

  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. ARM 环境下使用azure powershell 从远程blob中拉去vhd 并创建虚拟机
  2. R假设检验之k-s检验(KOLMOGOROV AND SMIRNOV TEST)
  3. 《LeetCode力扣练习》剑指 Offer 06. 从尾到头打印链表 Java
  4. data spring 指定时区_SpringBoot 统一时区的方案
  5. 解决Windows下新安装的CodeBlocks无法编译运行
  6. 处理unsigned相减错误(BIGINT UNSIGNED value is out of range)
  7. dotnet若干说明图片
  8. 【Elasticsearch】请在64位平台上使用Lucene的MMapDirectory
  9. 洛谷—— P2658 汽车拉力比赛
  10. ERROR: Could not find a version that satisfies the requirement PIL (from versions: none)
  11. Notification通知
  12. GreenDroid 开源UI组件
  13. 周立功arm linux教程,极速搭建周立功IMX287A ARM Linux开发环境
  14. python控制小爱同学_小爱同学控制电脑开机 - IT客栈
  15. 主界面边框流动效果长时间挂机后会卡顿
  16. java中的pojo是什么意思
  17. Linux系统设置命令大全
  18. 微生信在线绘制KEGG Pathway通路分类汇总图
  19. Category(类别)和扩展(Extension)的区别
  20. sublime快速插入多行递增的数字

热门文章

  1. 简单了解下DDOS产业
  2. 时域和频域的简单理解
  3. docker之daemon.json文件
  4. 《谁动了我的奶酪?》
  5. 【算法训练营学习笔记-Week06】一遍不懂就多刷几遍
  6. 信息系统项目管理(五)信息系统安全技术
  7. AddHeader使用方法
  8. 超全智能 电子设备cc0高清摄影图片素材网站整理
  9. 磁盘配额--对磁盘容量文件数量进行限制
  10. android图片压缩不失真实战