在多线程操作系统中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。

线程是有状态的,线程的状态被定义在Thread.State枚举中,在Java Doc中也有明确的解释:

通过查看源码以及阅读Java Doc,我们可以知道,线程主要有以下6种状态:

  • NEW

    • 当一个线程被创建出来的,但是还没调用start()方法的时候,他处于NEW状态。

  • RUNNABLE

    • 在Java虚拟机中执行的线程处于这种状态

  • BLOCKED

    • 正在等待锁的阻塞线程处于这种状态。

  • WAITING

    • 不确定地等待另一个线程执行某个特定操作的线程就是处于这种状态,进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。

  • TIMED_WAITING

    • 在指定的等待时间内等待另一个线程执行某个操作的线程处于这种状态。该状态不同于WAITING,它可以在指定的时间后自行返回。

  • TERMINATED

    • 已经退出的线程处于这种状态。

在指定的时间点,线程只能处于一种状态。但是需要注意的是这些状态表示的是虚拟机中线程的状态,而不是任何操作系统线程状态。

线程之间的状态是可以互相转换的,如下图:

上图,就是线程的6种状态的转换图,当遇到不同的操作或者事件的时候,线程的状态就可能发生变化。

Java Doc中说在Java虚拟机中正在执行的线程处于RUNNABLE状态,但是,在操作系统层面,一个线程要想被执行,是需要获得CPU的使用权的。

我们其实还可以把RUNNABLE状态进一步细化一下,根据线程是否获得了CPU的使用权分成两种:

  • 就绪(READY):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中并分配cpu使用权 。

  • 运行中(RUNNING):就绪(READY)的线程获得了cpu 时间片,开始执行程序代码。

也就是说,当一个线程被创建出来之后,执行了start方法之后,在没有获得cpu的使用权的时候,他就是就绪状态(READY),在获得了CPU的使用权,开始执行的时候,就是运行状态(RUNNING)了。

为什么没有定义RUNNING状态?

对于现在的分时操作系统来说,在单CPU情况下,所有的线程其实都是串行执行的。但是为了让我们看起来像是在并发执行,人们把CPU的执行分成很多个小的时间片。

哪个进程得到时间片,那个线程就执行,时间片到了之后,就要释放出CPU,再重新进行争抢时间片。

只要把时间片划分的足够细,那么多个程序虽然在不断的串行执行,但是看起来也像是在同时执行一样。

那么,CPU的时间片其实是很短的,一般也就是10-20毫秒左右。

那么,也就是说,在一秒钟之内,同一个线程可能一部分时间处于READY状态、一部分时间处于RUNNING状态。

那么如果,明确的给线程定义出RUNNING状态的话,有一个很大的问题,就是这个状态其实是不准的。

因为当我们看到线程是RUNNING状态的时候,很有可能他已经丢失了CPU时间片了。

对于线程的状态,我们只需要知道,他当前有没有在"正在参与执行"就行了,何为"参与执行"?

就是他的状态是可执行的,只要获得时间片,就能立即执行。

那这不就是RUNNABLE吗?

所以,Java就没有给线程定义RUNNING状态,而是定义了一个RUNNABLE状态。

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

漫话:如何给女朋友解释为什么Java线程没有Running状态?相关推荐

  1. 面试官问:为什么 Java 线程没有 Running 状态?我懵了

    转载自 面试官问:为什么 Java 线程没有 Running 状态?我懵了 什么是 RUNNABLE? 与传统的ready状态的区别 与传统的running状态的区别 当I/O阻塞时 如何看待RUNN ...

  2. 面试官问:为什么 Java 线程没有Running状态?我懵了

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 title: 面 ...

  3. 面试:为什么 Java 线程没有Running状态?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | my.oschina.net/goldenshaw/bl ...

  4. 为什么 Java 线程没有 Running 状态?一下被问懵!

    什么是 RUNNABLE? 与传统的ready状态的区别 与传统的running状态的区别 当I/O阻塞时 如何看待RUNNABLE状态? Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状 ...

  5. 为什么 Java 线程没有 Running 状态?

    Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态: 什么 ...

  6. java 切换panel会闪烁_【19期】为什么Java线程没有Running状态?

    Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态: 什么 ...

  7. java 线程状态_面试官问:为什么Java线程没有Running状态?我懵了

    点击上方"占小狼的博客",选择"设为星标" 本文阅读时间大约4分钟. 来源:https://dwz.cn/dLRLBZab Java虚拟机层面所暴露给我们的状态 ...

  8. java 线程状态_【19期】为什么Java线程没有Running状态?

    Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态: 什么 ...

  9. java线程四种状态

    一个线程可以有四种状态: 1.新(new), 即线程刚刚创建,而并未执行 2.可运行(runnable),意味着一旦时间分片机制有空闲的CPU周期提供给一个线程,那个线程便可立即开始运行.因此,线程可 ...

最新文章

  1. 对外星智能的搜索得到了重大的升级
  2. 从0到50家AI独角兽,中国人工智能凭什么让世界刮目相看?
  3. 【Android】3.12 兴趣点( POI)搜索功能
  4. 【华为云技术分享】云图说|应用编排服务AOS,助力应用上云自动化
  5. 文本框中只能输入小于等于100的正整数
  6. VC++6.0环境下调试c语言代码的方法和步骤_附图
  7. Debian 配置Bind9 DNS服务器
  8. windows完全卸载MySql数据库
  9. 【请验收】证券开户系统常规版本【SIS-OAS1.52.0】即时验证---验证通过------生产验收报告模板...
  10. 全体离职员工致某IT老板的一封公开信
  11. 小米路由器3是基于linux,小米路由器3(MI-3)刷华硕固件不用虚拟机刷华硕固件无需虚拟机方法...
  12. 智能优化算法课程设计
  13. springboot 启动 ApplicationContext applicationContext = null
  14. 【win10专业版】新建账户激活 Office 2019
  15. win11升级到22H2的疑难以及解决办法
  16. staruml 时序图操作
  17. solr(4)solr7.3.1 使用DIH上传结构化数据
  18. 大数据-Hadoop(环境搭建)
  19. 微信小程序使用前置摄像头拍照
  20. PIM-SM(ASM模型)

热门文章

  1. java后端模拟http请求_Http请求后端
  2. java怎么一段字符串全为数字_java 如何判断一个字符串是数字
  3. cmake 安装mysql5.6_使用cmake在CentOS6.5安装MYSQL5.6
  4. php mysql 备份还原_PHP执行Mysql数据库的备份和还原
  5. php中oop类,phpOOP类的用法_PHP教程
  6. python xlrd安装_详解python中xlrd包的安装与处理Excel表格
  7. 操作系统之计算机系统概述:1、操作系统概述(定义、功能、作用)
  8. 1-4:学习shell之操作文件与目录
  9. opencv调试利器ImageWatch的安装使用
  10. DENIED Redis is running in protected mode because protected mode is enabled