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,一经查实,立即删除!

相关文章

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

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

【红日安全】vulnstack (一)

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

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框架进行组件化开…

Unity开发Hololens项目

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

大规模多传感器滑坡检测数据集,利用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

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

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

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

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

C语言_指针_进阶

引言:在前面的c语言_指针初阶上,我们了解了简单的指针类型以及使用,下面我们将进入更深层次的指针学习,对指针的理解会有一个极大的提升。从此以后,指针将不再是难点,而是学习底层语言的一把利器。 本章重点…

vr体验馆计时收银软件试用版下载 佳易王VR游戏厅计时计费管理系统使用操作教程

一、前言 【软件试用版资源文件下载可以点击文章最后卡片了解】 vr体验馆计时收银软件试用版下载 佳易王VR游戏厅计时计费管理系统使用操作教程 VR体验馆计时计费软件是专门为VR体验馆设计的管理工具,旨在提高服务效率和客户的满意度。软件能够记录客户使用设备的…

vue组件调用生命周期

《vue基础学习-组件》提到组件传递数据方式: 1. props/$emit 父传子:子组件通过 props 显式声明 自定义 属性,接收父组件的传值。子传父:子组件通过 $emit() 显式声明 自定义 事件,父组件调用自定义事件接收子组件返…

Docker-compose提示specified IP address..configured subnets问题以及Docker容器相关操作记录保存

一、Docker-compose提示user specified IP address is supported only when connecting to networks with user configured subnets 在网上下载的一些docker-compose.yml在执行的时碰到过多次如下报错: ERROR: for 5307e2acb....user specified IP address is supp…

2024.10.17 软考学习笔记

刷题网站: 软考中级软件设计师在线试题、软考解析及答案-51CTO题库-软考在线做题备考工具

vue2项目 实现上边两个下拉框,下边一个输入框 输入框内显示的值为[“第一个下拉框选中值“ -- “第二个下拉框选中的值“]

效果: 思路: 采用vue中 [computed:] 派生属性的方式实现联动效果,上边两个切换时,下边的跟随变动 demo代码: <template><div><!-- 第一个下拉框 --><select v-model"firstValue"><option v-for"option in options" :key&q…

Github优质项目推荐 - 第六期

文章目录 Github优质项目推荐 - 第六期一、【WiFiAnalyzer】&#xff0c;3.4k stars - WiFi 网络分析工具二、【penpot】&#xff0c;33k stars - UI 设计与原型制作平台三、【Inpaint-Anything】&#xff0c;6.4k stars - 修复图像、视频和3D 场景中的任何内容四、【Malware-P…

适用于 Windows 的 4 个最佳免费数据恢复软件

计算机最重要的是用户数据。除了您的数据之外&#xff0c;关于计算机的其他一切都是可替换的。这三个是数据丢失的最常见原因&#xff1a; 文件/文件夹删除 丢失分区 损坏的分区 文件/文件夹删除是最常见的数据丢失类型。大多数时候&#xff0c;由于不小心删除文件/文件夹而…