Java线程的状态以及转换条件,与操作系统线程状态的区别?

先看图增加点记忆。

  1. Java线程状态:
    在这里插入图片描述

  2. 线程状态转换图:
    在这里插入图片描述

背景知识

JAVA的线程模型与操作系统线程的对应关系是1:1的,线程的调度权是由操作系统控制的。

为什么java的线程状态与操作系统不一致?

JVM线程状态:RUNNABLE

JVM的线程状态 RUNNABLE 覆盖了操作系统中的 READY 和 RUNNING 两种状态,这是因为 JVM 对线程调度和管理的抽象和粒度与操作系统不同。
在JVM中,RUNNABLE 状态表示线程可以被执行。这种状态表明线程已经就绪,可能正在运行,也可能等待CPU资源。
RUNNABLE 状态实际上表示两种可能的情况:

  • 线程已经就绪,等待操作系统的调度分配CPU时间片,这对应操作系统的 READY 状态。
  • 线程正在被操作系统调度并且正在执行中,这对应操作系统的 RUNNING 状态。
操作系统中的线程状态

操作系统的线程状态更细化,因为调度权利在操作系统手中,其随时可以把控调度的细节。其中:
READY:线程已经准备好执行,但暂时没有被分配CPU。
RUNNING:线程正在被CPU执行。

因此,综上所述,JVM的RUNNABLE = 操作系统的READY + RUNNING原因主要有以下几点:
a. JVM与操作系统的抽象粒度不同
JVM 是运行在操作系统之上的虚拟机,负责管理 Java 应用的生命周期和资源调度。JVM 并不直接管理CPU资源,而是依赖操作系统的线程调度器来分配时间片。因此,JVM 中的 RUNNABLE 代表的是逻辑上可以被执行的状态,而 JVM 无法直接区分线程是正在被操作系统调度(即 RUNNING),还是已经准备好但尚未被调度(即 READY)。
这种设计简化了JVM对线程的管理,JVM只需要关心线程是否有资格被调度,而不需要深入到操作系统层面来判断线程是正在运行还是等待CPU调度。

b. 跨平台设计的简化
JVM是跨平台的,它在不同操作系统上运行,但操作系统的线程状态和调度机制可能略有不同。为了保持跨平台的一致性,JVM不区分操作系统的 READY 和 RUNNING 状态,而是将它们统一映射为 RUNNABLE。这样,JVM的线程模型可以在不同的操作系统上保持一致性。

c. 操作系统负责实际的调度
线程在操作系统中的调度是由操作系统的调度器来管理的,操作系统通过上下文切换来在 READY 和 RUNNING 之间切换线程。JVM的 RUNNABLE 只是表示“线程已准备好被操作系统调度”,而实际的调度过程由操作系统完成。因此,JVM没有必要区分这两个状态。


手动分割线,另外说一点题外话:

  1. 如果jvm的线程状态与操作系统保持一致,抛开设计的复杂度和跨平台兼容性不谈。 试想一下这些状态的被设计出来的目的是什么?
    为了让使用者更加准确获知线程的执行细节和当前状态,为排查问题提供便利性和指导方向。尤其是waitting、blocked这些状态,已经能够明确帮助我们在出现问题时进行排查分析了。

  2. 如果加上了ready和running状态,会有什么不一样?
    使用时间片轮转抢占式调度的操作系统,每次分配的时间片只有几十毫秒,试想在这样的情况下还需要不停地修改用户态jvm线程的状态,并且最终在监控中展示和记录。 当真正需要使用的时候,你就会惊奇的发现状态一直在不停地改变,而且对于一个没有调度权利的程序而言,什么也做不了。
    增加之后的优势在于,正是因为jvm线程状态的这种模糊性,以至于出现问题当需要对某个线程分析的时候,打印出来的线程栈信息中无法准确知道当前究竟是在等待CPU资源还是正在运行状态,因此会无法直观获得结果。需要借助于操作系统负载等等信息猜测原因。例如是否产生饥饿、堆积导致迟迟未被调度。
    总而言之,相较于目前设计而言,增加了ready和running状态之后的收益其实并不明显,因为jvm并不能控制操作系统的调度策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/55506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis二级缓存类加载问题

问题 CacheNamespace 修饰的接口,例如MapperA, 要先与CacheNamespaceRef(MapperA.class)修饰的接口加载 你遇到的问题是由于 Spring Boot 启动时,加载顺序导致 B 先加载,而 A 的缓存命名空间还没有被创建。这是 MyBatis 在解析 …

机器学习摘下诺奖桂冠

前言 近日,2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者,这是历史上首次出现这样的情况。这项奖项原本只授予对自然现象和物质的物理学研究作出重大贡献的科学家,如今却将全球范围内对机器学习和神经网络的研究和开发作为了一…

Kubernetes ETCD的恢复与备份

在 Kubernetes 中,ETCD 扮演着至关重要的角色: 1. 集群状态存储 2. 服务发现 3. 配置管理 4. 分布式锁和协调 5. 故障恢复 ETCD 存储了 Kubernetes 集群中所有的状态信息,包括节点、Pod、Service、ConfigMap、Secrets 等。ETCD 支持服务发现…

【含开题报告+文档+PPT+源码】基于SSM的景行天下旅游网站的设计与实现

开题报告 随着互联网的快速发展,旅游业也逐渐进入了数字化时代。作为一个旅游目的地,云浮市意识到了互联网在促进旅游业发展方面的巨大潜力。为了更好地推广云浮的旅游资源,提高旅游服务质量,云浮市决定开发一个专门的旅游网站。…

【红日安全】vulnstack (一)

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍收藏💗支持一下哦 【红日安全】vulnstack (一) 靶场搭建靶场渗透明确目标信息收集phpadmin后台getshell 靶场搭建 靶场下载…

tracert和ping的区别

1、简介 tracert(在 Windows 系统中)和 traceroute(在 Unix/Linux 系统中)以及 ping 都是网络诊断工具,但它们的功能和用途有所不同: ping: 用途:ping 是一个网络工具&…

IP报文格式、IPv6概述

IPv4报文格式 IPv4报文首部长度至少为20字节(没有可选字段和填充的情况下),下面来逐一介绍首部各个字段的含义 Version版本:表示采用哪一种具体的IP协议,对于IPv4来说该字段就填充4以表示,如果是IPv6就填充6IHL首部长度&#xff…

网络资源模板--Android Studio 实现简易计算器App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 实现的简易计算器 二、项目测试环境 三、项目详情 动态绑定按钮: 使用循环遍历 buttons 数组,根据动态生成的按钮 ID (btn_0, …

SQL进阶技巧:如何删除第N次连续出现NULL值所存在的行?

目录 0 场景描述 1 数据准备 2 问题分析 问题拓展:如何删除第2次、第3次、第N次连续出现NULL值所在的行? 3 小结 0 场景描述 有下面的场景: 我们希望删除某id中连续存在NULL值的所有行,但是保留第一次出现不为NULL值的以下所有存在NULL值的行。具体如下图所示: 如…

iframe的使用详解

目录 一、基本概念和语法 二、优点 1.内容整合与复用: 2.独立的浏览环境: 3.跨域数据展示: 三、缺点 1.可访问性问题: 2.性能问题: 3.安全风险: 四、替代方案 1.使用JavaScript框架进行组件化开…

开源模型应用落地-Qwen2.5-7B-Instruct与vllm实现推理加速的正确姿势-Docker-Tools助力(四)

一、前言 目前,大语言模型已升级至Qwen2.5版本。无论是语言模型还是多模态模型,均在大规模多语言和多模态数据上进行预训练,并通过高质量数据进行后期微调以贴近人类偏好。 另外,使用 Docker 实现便捷测试成为一种高效的解决方案。通过将模型及其运行环境封装在 Docker 容器…

Unity开发Hololens项目

Unity打包Hololens设备 目录Visual Studio2019 / Visual Studio2022 远端部署设置Visual Studio2019 / Visual Studio2022 USB部署设置Hololens设备如何查找自身IPHololens设备门户Unity工程内的打包设置 目录 记录下自己做MR相关:Unity和HoloLens设备的历程。 Vi…

《C++之美:简洁与功能的完美平衡》

在 C编程的世界里,追求代码的审美效果不仅仅是一种艺术追求,更是提高代码质量、增强可读性和可维护性的关键。而在众多考量因素中,代码的简洁性与功能性之间的平衡成为了一个核心问题。那么,究竟如何在 C中实现这种平衡&#xff0…

大规模多传感器滑坡检测数据集,利用landsat,哨兵2,planet,无人机图像等多种传感器采集数据共2w余副图像,mask准确标注滑坡位置

大规模多传感器滑坡检测数据集,利用landsat,哨兵2,planet,无人机图像等多种传感器采集数据共2w余副图像,mask准确标注滑坡位置 大规模多传感器滑坡检测数据集介绍 数据集概述 名称:大规模多传感器滑坡检测…

Python | Leetcode Python题解之第491题非递减子序列

题目: 题解: class Solution:def findSubsequences(self, nums: List[int]) -> List[List[int]]:def dfs(i, tmp):if i len(nums):if len(tmp) > 2:res.append(tmp[:]) # 拷贝,tmp[:]而非tmpreturn# 选 nums[i]if not tmp or nu…

2d 数字人实时语音聊天对话使用案例;支持asr、llm、tts实时语音交互

参考: https://github.com/lyz1810/live2dSpeek 下载live2dSpeek项目 ## 下载live2dSpeek git clone https://github.com/lyz1810/live2dSpeek cd live2dSpeek-main ## 运行live2dSpeek npm install -g http-server http-server .更改新的index.html页面 index.html

Vue.js 组件化开发:从入门到进阶

Vue.js 组件化开发:从入门到进阶 👋 大家好,今天我们来聊一聊 Vue.js 的 “组件化开发”。目前 Vue 开发已经相对成熟了,相信很多朋友对组件化开发并不陌生。 如果你对组件化开发已经非常熟悉,看到我的文章&#xff…

【SQL Server】数据库在新建查询后闪退——解决方案:以管理员的身份运行

我的SQLServer2022之前都是可以用的,隔了好久没有使用,今天要用到去写一些SQL 语句 结果在点击新建查询后闪退了, 经过查询后,解决方案: 以管理员的身份运行后点击新建查询,发现正常了 总结:以…

H5对接海康硬盘录像机视频简单说明

开发过程中使用HTML5(通常是通过Web技术栈,如HTML、CSS、JavaScript)与海康威视(Hikvision)的硬盘录像机(DVR)进行视频对接,通常涉及以下步骤: 获取DVR的RTSP流地址:海康威视DVR支持RTSP协议,你可以通过DVR的管理界面获取每个摄像头的RTSP流地址。 使用视频播放器库…

记一次库版本升级引起程序自动停止

记一次库版本升级引起程序自动停止 最近我们的应用升级了jedis 版本,版本从 2.10.2 升级 到3.8.0。发现我们的任务应用启动后立马自动关闭了。 这就奇怪了,为什么升级个版本,会导致程序启动后自动关闭呢。带着这个疑问我们看下代码。 表现如下&#x…