并发-线程的 6 个状态(生命周期)

目录

状态解释

状态间的转化


状态解释

状态间的转化

  • 根据Thread类中定义的枚举类型State值,可以看出有6种状态:
  • 可以通过 Thread.getState 方法获得线程的状态
  • NEW(新建)New
  • 新建了Thread类对象,但是没有启动的线程
  • 尚未启动;已创建但是还没有启动的线程,比如new Thread后的线程,但是还没执行start方法
  • RUNNABLE(可运行状态,而不只是正在运行的)Runnable
  • 正在 JVM 中运行;或者正在等待操作系统的其他资源(比如处理器)
  • new后的线程,调用了start方法,此时的线程就是Runnable状态
  • 有些编程语言会把RUNNABLE分成2种情况:1-running和2-ready
  • 也就是处于此状态的线程有可能正在执行,也有可能正在等待着CPU为它分配执行时间(该线程已经获取了除CPU资源外的其他资源,等待获取CPU 资源后才会真正处于运行状态)
  • 以上2种在Java中都属于Runnable
  • 调用了start方法,不代表线程启动了,有可能还在队列中等待资源分配,还没被处理器执行
  • 拿到CPU运行后,同样也叫做Runnable状态
  • 运行时的线程,CPU资源被抢走了,此时线程还是处于Runnable状态,因为只要得到CPU,它就可以继续运行
  • Runnable既可以代表可运行的,也可以代表运行中的
  • BLOCKED(被阻塞) Blocked
  • 正在等待监视器锁(内部锁)的释放
  • 当一个线程进入到被synchronized修饰的代码块时,而且该锁被其他线程拿走了,那么这个线程的状态就是Blocked
  • 一定是进入了被Synchronized保护的代码
  • 比如线程A进入了一个synchronized方法,线程B也想进入这个方法
  • 但是这个方法的锁已经被线程A获取了,这个时候线程B就处于BLOCKED状态
  • WAITING(无限期等待) Waiting
  • 处于waiting状态的线程会等待另外一个线程处理特殊的行为
  • 举个例子,如果一个线程调用了wait方法(并且没有使用timeout参数),那么这个线程就会处于waiting状态直到另外一个线程调用这个对象的notify或者notifyAll方法后才会解除这个状态
  • 线程调用以下方法会处于无限期等待状态:
  • 1-没有设置Timeout参数的 Object.wait()方法
  • 2-没有设置Timeout参数的 Thread.join()方法
  • 3-LockSupport.park()方法
  • Object.wait(),Thread.join(),LockSupport.park()方法会让线程从Runnable进入Waiting状态
  • 注意这里的方法不带参数,等待没有时间限制
  • 会一直等待,直到手动唤醒
  • 唤醒信号:Object.notify(),Object.notifyAll(),LockSupport.unpark()会让线程从Waiting唤醒,回到Runnable状态
  • TIMED_WAITING(限期等待) Timed Waiting
  • 无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒
  • 等待时间内,也可以被唤醒信号唤醒
  • 线程调用带有正的等待时间参数的下列各方法时,会处于定时等待状态:
  • 1-Thread.sleep(long millis)方法,常常用“使一个线程睡眠”进行描述
  • 2-设置了Timeout参数的 Object.wait()方法,常常用“挂起一个线程”进行描述
  • 3-设置了Timeout参数的 Thread.join()方法
  • 4-LockSupport.parkNanos()方法(带有时间)
  • 5-LockSupport.parkUntil()方法(带有时间)
  • 一般来说,把Blocked(被阻塞)、Waiting(无限期等待)、Timed_Waiting(限期等待)都称为阻塞状态,不仅仅是Blocked
  • 睡眠和挂起是用来描述行为,而阻塞和等待用来描述状态
  • 阻塞和等待的区别在于,阻塞是被动的,它是在等待获取一个排它锁
  • 而等待是主动的,通过调用 Thread.sleep() 和 Object.wait() 等方法进入
  • TERMINATED(终止状态) Terminated
  • 已经执行完毕,已终止线程的线程状态,线程已经结束执行
  • 可以是线程结束任务之后自己结束,或者因产生了异常而结束
  • 上述6种状态在遇到特定事件发生的时候将会互相转换,它们的转换关系如下图:
  • 上图状态的转换和方法已经很清晰了
  • 锁池队列:当资源被一个线程访问时,上锁后,其他线程就会进入锁池队列,当锁释放后,其他线程获得了锁,就会变成可运行状态
  • 《Thinking in Java》中线程被阻塞的五种可能原因:
    1. 线程调用 sleep(ms) ,使线程睡眠,规定时间内,该线程不会运行
    2. 使用suspend()暂停了线程的执行,除非收到resume()消息,否则不会进入可运行状态
    3. 线程正在等待一些IO操作完成
    4. 线程试图调用另一个对象的同步方法,但那个对象处于锁状态,暂时无法使用
    5. 调用wait()暂停了线程的执行,进入了等待队列

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软设之进程资源图

进程资源图有两个要素,一个是P,也就是进程,一个是R,可以用R1或者R2等表示,表示资源。 R一般是一个矩形里面有几个圆圈,有几个圆圈就表示有几个资源 这里用R1表示资源,P表示进程 R1P 表示资源…

Tomcat启动闪退怎么解决(文末附终极解决方案)

AI是这么告诉我的 Tomcat启动时出现闪退问题可能由多种原因引起,以下是解决此类问题的一些通用方法: 检查环境变量: 确保已经正确设置了JAVA_HOME和JRE_HOME环境变量,并指向正确的Java安装路径。将Java的bin目录添加到系统的PATH…

频谱模拟器

频谱模拟器,特别是模拟频谱仪,是一种基于特定原理的频谱分析工具。以下是对其的详细介绍: 工作原理: 模拟频谱仪的工作原理主要基于频率转换原理,包括两个关键步骤:信号混频和滤波分析。 信号混频&#xf…

《Fundamentals of Power Electronics》——升压隔离型变换器、SEPIC隔离型变换器

以下是升压型隔离变换器的相关知识点: 升压型隔离变换器可以通过互换降压型隔离变换器的电源与负载的位置得到。升压型隔离变换器有许多种结构,此处简短的讨论两种情况。这些转换器主要使用在高压电源和低谐波整流器中。 图6.36所示是一种全桥型电路结…

【设计模式】13、template 模板模式

文章目录 十三、template 模板模式13.1 ppl13.1.1 目录层级13.1.2 ppl_test.go13.1.3 ppl.go13.1.4 llm_ppl.go13.1.5 ocr_ppl.go 十三、template 模板模式 https://refactoringguru.cn/design-patterns/template-method 如果是一套标准流程, 但有多种实现, 可以用 template …

PR2019软件下载教程

打开下载网址:rjctx.com 选择Premiere: 选择PR2019,并点击: 拉到最后,选择百度网盘下载: 下载到本地。 二,软件安装 解压缩后,双击set_up 选择位置后,进行安装&…

场景文本检测识别学习 day08(无监督的Loss Function、代理任务、特征金字塔)

无监督的Loss Function(无监督的目标函数) 根据有无标签,可以将模型的学习方法分为:无监督、有监督两种。而自监督是无监督的一种无监督的目标函数可以分为以下几种: 生成式网络的做法,衡量模型的输出和固…

Python爬虫-BeautifulSoup解析

1.简介 BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库。它提供了一种灵活且方便的方式来导航、搜索和修改树结构或标记文档。这个库非常适合网页抓取和数据提取任务,因为它允许你以非常直观的方式查询和操作文档内容。 2.安装 Beautiful Soup 终端输…

【与 Apollo 共创生态:展望自动驾驶全新未来】

1、引言 历经七年的不懈追求与创新,Apollo开放平台已陆续推出了13个版本,汇聚了来自全球170多个国家与地区的16万名开发者及220多家合作伙伴。随着Apollo开放平台的不断创新与发展,Apollo在2024年4月19日迎来了Apollo开放平台的七周年大会&a…

golang for经典练习 金字塔打印 示例 支持控制台输入要打印的层数

go语言中最经典的for练习程序 金字塔打印 &#xff0c;这也是其他语言中学习循环和条件算法最为经典的联系题。 其核心算法是如何控制内层循环变量j 每行打印的*号数量 j<i*2-1 和空格数量 j1 || j i*2-1 golang中实现实心金字塔 Solid Pyramid和空心金字塔 Hollow Pyram…

ruoyi漏洞总结

若依识别 黑若依 :icon hash"-1231872293 绿若依 :icon hash"706913071” body" 请通过前端地址访 " body" 认证失败&#xff0c;无法访问系统资源 " 如果页面访问显示不正常&#xff0c;可添加默认访问路径尝试是否显示正常 /login?redi…

20232937文兆宇 2023-2024-2 《网络攻防实践》实践八报告

20232937文兆宇 2023-2024-2 《网络攻防实践》实践八报告 1.实践内容 动手实践任务一 对提供的rada恶意代码样本&#xff0c;进行文件类型识别&#xff0c;脱壳与字符串提取&#xff0c;以获得rada恶意代码的编写作者&#xff0c;具体操作如下&#xff1a; &#xff08;1&am…

Deep Learning Part Eight--Attention 24.5.4

01.在翻译、语音识别等将一个时序数据转换为另一个时序数据的任务中&#xff0c;时序数据之间常常存在对应关系 02.Attention 从数据中学习两个时序数据之间的对应关系 03.Attention 使用向量内积&#xff08;方 法之一&#xff09;计算向量之间的相似度&#xff0c;并输出这个…

【C++题解】1658. 游乐设施

问题&#xff1a;1658. 游乐设施 类型&#xff1a;分支结构 题目描述&#xff1a; 游乐场引进了一个新的游乐设施&#xff0c;可以两人一组开动该设施&#xff0c;但设施设计上有一个缺陷&#xff0c;必须一个人的体重在 60 公斤以上&#xff08;包含 60 公斤&#xff09;&am…

CST保存项目时失败?如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

AI智能名片商城小程序构建企业级私域的IMC模型:IP、MarTech与Content的深度融合

在数字化营销的新时代&#xff0c;为企业定制开发的AI智能名片B2B2C商城小程序&#xff0c;结合我们丰富的私域运营实践&#xff0c;我们深刻领悟到构建企业级私域的三大核心要素&#xff1a;IP&#xff08;企业人设&#xff09;、MarTech&#xff08;营销技术&#xff09;和Co…

飞机起飞降落

第一版&#xff1a;飞机起飞降落脚本 最大速度是1200&#xff0c;螺旋桨速度到1000的时候飞机会上升&#xff0c;到850的时候会下降&#xff0c; 有上升状态&#xff0c;平飞状态和悬浮状态&#xff0c;三个状态按e都可以使螺旋桨减速然后下降 但是是匀速下降&#xff0c;并且…

对命令模式的理解

目录 一、场景1、文本编辑器并不是一个好的例子&#xff0c;设备控制器才是2、设备控制器的demo 二、不用命令模式1、代码2、问题 三、使用命令模式1、代码2、当需求变化时2.1 新增代码2.2 优点 四、进一步思考1、省略对Command的建模可以吗&#xff1f;2、命令模式的价值 一、…

wpf转换器

WPF&#xff08;Windows Presentation Foundation&#xff09;中的转换器主要是指IValueConverter接口的实现&#xff0c;它用于在数据绑定过程中转换源数据和目标数据的类型或表示形式。这种机制使得开发者能够灵活地处理数据&#xff0c;特别是在用户界面&#xff08;UI&…

知识图谱需求

文章目录 公共安全数字经济金融科技资源优化科学研究制造业转型公共健康人文发展 公共安全 公共安全领域信息化以现代通信、网络、数据库技术为基础&#xff0c;将所研究对象各要素汇总至数据库&#xff0c;并针对各个业务领域进行定制化开发&#xff0c;以满足公共安全实战需求…
最新文章