线程的生命周期及状态转换

线程的生命周期指的是从创建到结束的整个过程,包括线程的创建、运行、阻塞、唤醒、等待、终止等状态。在不同的编程语言和操作系统中,线程的状态和状态转换可能略有不同,但基本的概念是相似的。以下是线程生命周期中常见的状态及其转换:

1. **新建(New)**:
   - 线程被创建,但还没有开始运行。在这个阶段,线程已经被分配了必要的资源,如内存空间等,但还没有被调度执行。

2. **就绪(Runnable)**:
   - 线程已经准备好运行,它已经获得了除CPU以外的所有必要资源,正在等待CPU时间片以便执行。在这个阶段,线程可能在运行,也可能在就绪队列中等待。

3. **运行(Running)**:
   - 线程正在执行。在单核处理器上,同一时刻只能有一个线程处于运行状态;在多核处理器上,可以有多个线程同时运行。

4. **阻塞(Blocked)**:
   - 线程正在等待一个监视器锁(例如,等待一个同步块或方法释放锁)或其他资源,因此不能继续执行。在这个阶段,线程不会占用CPU时间。

5. **等待(Waiting)**:
   - 线程通过调用`wait()`方法进入等待状态,它释放了对象的锁,并等待其他线程调用相同对象的`notify()`或`notifyAll()`方法。在等待状态中,线程不会去竞争CPU资源,也不能被中断。

6. **超时等待(Timed Waiting)**:
   - 线程在指定的时间段内等待,例如通过调用`wait(long timeout)`、`sleep(long millis)`、`join(long millis)`等方法。超时后,线程会自动转换回就绪状态。

7. **终止(Terminated)**:
   - 线程执行完毕或因为某种原因被强制终止。在这个阶段,线程释放了所有资源,并从系统中彻底消失。

状态转换如下:

- **新建 -> 就绪**:当线程被创建后,它会被放入就绪队列等待调度。
- **就绪 -> 运行**:当线程获得CPU时间片时,它从就绪状态转换到运行状态。
- **运行 -> 阻塞**:当线程请求一个已经被其他线程占用的资源时,它会被阻塞。
- **运行 -> 等待**:当线程调用`wait()`方法时,它会释放对象锁并进入等待状态。
- **等待 -> 就绪**:当其他线程调用`notify()`或`notifyAll()`方法时,等待状态的线程可能会被唤醒,并转换回就绪状态。
- **超时等待 -> 就绪**:如果在指定的超时时间内没有被唤醒,线程会自动从超时等待状态转换回就绪状态。
- **运行/阻塞/等待 -> 终止**:当线程执行完毕或被中断导致异常退出时,它会从任何状态转换到终止状态。

请注意,具体的线程状态和转换可能会根据具体的编程环境和操作系统有所不同。
 

在线程状态转换中,“阻塞”(Blocked)和“等待”(Waiting)是两种不同的状态,它们的主要区别在于线程的行为和原因:

1. **阻塞(Blocked)**:
   - **原因**:线程被阻塞通常是因为它正在尝试获取一个已经被其他线程占用的同步资源(如锁)。在这种情况下,线程必须等待直到它能够获得该资源。
   - **行为**:阻塞状态的线程不会释放对象的锁,它在等待获取锁的同时,不会做任何其他事情,也不会被CPU调度执行。
   - **唤醒**:线程从阻塞状态被唤醒通常是由其他线程释放了锁,并且线程调度器决定将该线程调度到运行状态。

2. **等待(Waiting)**:
   - **原因**:线程进入等待状态通常是因为它调用了某些特定的方法,如`wait()`、`join()`或`LockSupport.park()`,这些方法会使线程主动放弃对象的锁并进入等待状态,直到被显式地唤醒。
   - **行为**:处于等待状态的线程不会去尝试获取任何锁,它们被挂起,直到被其他线程通过调用`notify()`、`notifyAll()`、`interrupt()`或`LockSupport.unpark()`等方法唤醒。
   - **唤醒**:线程从等待状态被唤醒需要外部的干预,比如其他线程调用了`notify()`或`notifyAll()`方法,或者线程被中断。

总结区别:
- **阻塞**是线程因为竞争资源而被动进入的状态,它在等待获取资源的同时不会释放锁。
- **等待**是线程通过调用特定的方法主动进入的状态,它在等待被唤醒的同时会释放锁。

这两种状态的主要区别在于线程是否主动放弃锁以及它们被唤醒的方式。阻塞状态的线程需要外部资源的释放来被唤醒,而等待状态的线程则需要其他线程的显式唤醒操作。
 

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

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

相关文章

后端-mybatis的一对一查询

准备两张表菜单表和分类表,一个菜单对应一个分类,一个分类对应多个菜单,我们从菜单对分类来操作一对一的关系,首先在菜单表里面要有一个分类表的id字段。 使用mapper的映射文件.xml来写的话我们在resource目录下创建各自mapper的…

量化交易系统开发-实时行情自动化交易-8.量化交易服务平台(一)

19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来会对于收集整理的33个量化交易服…

mysql_题库详解

1、如何创建和删除数据库? 1)创建数据库 CREATE DATABASE 数据库名; 2)删除数据库 drop database 数据库名; 2、MyISAM与InnoDB的区别? 1)事务:MyISAM 不支持事务 InnoDB 支持 2)行锁/表锁&a…

修改Docker 默认存储目录( Docker Root Dir: /var/lib/docker)

Docker 默认将所有的数据(包括镜像、容器、卷等)存储在 /var/lib/docker 目录下。这个目录默认被配置在系统的根分区或者较小的分区上。随着容器化应用的增加,或者 Docker 容器和镜像的数量增加,默认存储位置可能会迅速填满&#…

CentOS startx 启动失败的解决方法

第一个错误:MESA-LOADER: failed to open mgag200: /usr/lib64/dri/mgag200_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib64/dri) failed to load driver: mgag200 解决方法:安装缺失mesa驱动&#xff0…

week 9 - Entity-Relationship Modelling

一、数据库设计的重要性 • 设计数据库可使查询更高效、简洁。 • 减少数据冗余(data redundancy),提升表的整洁性。 二、Key Components of ER Modelling 实体-关系建模的基本构成 1. 实体(Entity):表…

BUUCTF—Reverse—Java逆向解密(10)

程序员小张不小心弄丢了加密文件用的秘钥,已知还好小张曾经编写了一个秘钥验证算法,聪明的你能帮小张找到秘钥吗? 注意:得到的 flag 请包上 flag{} 提交 需要用专门的Java反编译软件:jd-gui 下载文件,发现是个class文…

图卷积网络GCN与图注意力网络GAT原理详解

文章目录 1. Why 图卷积网络GCN?2. GCN的原理2.1 GCN的输入2.2 GCN的核心公式2.3 GCN 的核心公式推导的直观理解 3. Why 图注意力网络GAT?4. GAT的原理4.1 GAT的输入4.2 GAT的流程及核心公式 References 1. Why 图卷积网络GCN? GCN(Graph Co…

ELK Fleet JAVA LOG收集与展示教程

目录 elastic-fleet架构 Elastic Agent的优势 Fleet JAVA日志收集流程 1.注册Fleet Sever 2.创建JAVA代理收集策略Agent Policy 3.添加集成 integration 4.调整Java log输出格式 5.添加Elastic Agent 6.添加Ingest 7.创建数据视图 8.其他Policy nginx-policy syst…

电脑提示报错“Directx error”怎么解决?是什么原因导致的?游戏软件提示“Directx error”错误的解决方案

DirectX Error(DX错误)通常指的是在使用基于DirectX技术的应用程序(尤其是游戏)时遇到的问题。这个问题可能由多种因素导致,以下是一些可能的原因及相应的解决方案: 可能的原因 DirectX版本不匹配&#x…

Go语言技巧:快速统一字符串中的换行符,解决跨平台问题

统一字符串中的 Windows \r\n 换行符 — Go语言实现 在编程中,尤其是处理跨平台的文本数据时,换行符的处理是一个常见的问题。Windows 系统使用 \r\n 作为换行符,而 Unix-like 系统(如 Linux 和 macOS)使用 \n。在 Go…

jmeter 压测常用静默参数解释应用

简介: JMeter静默压测(即无界面压测)是一种常用的性能测试方法,用于模拟多个用户同时访问系统并测量系统的响应时间和吞吐量等关键性能指标。在JMeter静默压测中,常用的压测参数及其解释如下: 一、基本…

自动驾驶目标检测融合全貌

1、early fusion 早期融合,特点用到几何空间转换3d到2d或者2d到3d的转换,用像素找点云或者用点云找像素。 2、deep fusion 深度融合,也是特征级别融合,也叫多模态融合,如bevfusion范式 3、late fusion 晚融合&#x…

OpenAI Whisper 语音识别 模型部署及接口封装

环境配置: 一、安装依赖: pip install -U openai-whisper 或者,以下命令会从这个存储库拉取并安装最新的提交,以及其Python依赖项: pip install githttps://github.com/openai/whisper.git 二、安装ffmpeg: cd …

⽂件操作详解

⽬录 一 文件操作的引入 1 为什么使⽤⽂件? 2 什么是⽂件? 3 文件分类(1 从⽂件功能的⻆度来分类:程序⽂件/数据⽂件 2根据数据的组织形式:为⽂本⽂件/⼆进制⽂件) 二 ⽂件的打开和关闭 1 …

GPT(Generative Pre-trained Transformer) 和 Transformer的比较

GPT(Generative Pre-trained Transformer) 和 Transformer 的比较 flyfish 1. Transformer 是一种模型架构 Transformer 是一种通用的神经网络架构,由 Vaswani 等人在论文 “Attention Is All You Need”(2017)中提…

Qt 项目中同时使用 CMAKE_AUTOUIC 和 UiTools 的注意事项

在 Qt 项目开发中,.ui 文件是界面设计的重要组成部分。开发者可以通过两种主要方式使用 .ui 文件: 编译期处理:通过 Qt 的 uic 工具将 .ui 文件转化为 C 代码(ui_xxx.h),静态绑定到项目中。运行时动态加载…

gitee:解决vs文件权限被拒问题

报错问题 分析原因 git上传要忽略vs文件, Git因致命错误而失败。权限被拒绝 无法处理的路径。 解决方法 1、项目根目录下->右击空白->Open Git Bash here 2、 创建.gitignore文件 命令 touch .gitignore 3、 文件开头输入 .vs保存 参考地址 VS2017 Git fa…

【03】Selenium+Python 八种定位元素方法

操作元素,需要先查找定位到对应的元素。 查找单个元素:driver.find_element() 返回是一个web element 对象 查找多个元素:driver.find_elements() 返回是一个list对象 By 是 Selenium 中一个非常重要的类,用于定位网页元素。 使…

【linux学习指南】详解Linux进程信号保存

文章目录 📝保存信号🌠 信号其他相关常⻅概念🌉在内核中的表⽰ 🌠 sigset_t🌠信号集操作函数🌉sigprocmask🌉sigpending 🚩总结 📝保存信号 🌠 信号其他相关常…