【线程有哪些状态?这些状态如何相互转换?阻塞和等待的状态有什么区别?】

news2025/7/16 2:35:09

线程状态及其转换与区别

线程的生命周期包含多个状态,不同状态之间的转换由线程调度和同步机制决定。以下是线程状态的详细说明、转换关系及阻塞与等待的区别:


一、线程的六种基本状态(以Java为例)

状态描述
NEW(新建)线程被创建但未启动(start() 尚未调用)。
RUNNABLE(可运行)线程已启动,可能正在运行或等待CPU时间片(包含操作系统的就绪和运行状态)。
BLOCKED(阻塞)线程因等待获取锁而无法进入同步块/方法(如其他线程持有锁)。
WAITING(等待)线程主动进入无限期等待,需其他线程显式唤醒(如调用 wait()join())。
TIMED_WAITING(计时等待)线程在指定时间内等待(如 sleep(ms)wait(timeout))。
TERMINATED(终止)线程执行完毕或异常退出。

二、状态转换关系与触发条件

  1. NEW → RUNNABLE
    触发条件:调用 start() 方法启动线程。

  2. RUNNABLE ↔ RUNNING(操作系统层面)
    运行 → 就绪:时间片用完或被更高优先级线程抢占(由操作系统调度决定)。
    就绪 → 运行:被操作系统调度选中,分配CPU时间片。

  3. RUNNABLE → BLOCKED
    触发条件:尝试进入同步块/方法时,锁已被其他线程持有。
    示例:线程A持有锁,线程B尝试进入同步块时被阻塞。

  4. RUNNABLE → WAITING
    触发条件:调用无超时的 wait()join()LockSupport.park()
    示例:线程调用 object.wait() 主动释放锁并进入等待队列。

  5. RUNNABLE → TIMED_WAITING
    触发条件:调用带超时的 sleep(ms)wait(timeout)join(timeout)
    示例:线程调用 Thread.sleep(1000) 休眠1秒。

  6. BLOCKED → RUNNABLE
    触发条件:锁被释放(如持有锁的线程退出同步块)。
    示例:线程A释放锁后,线程B成功获取锁并恢复执行。

  7. WAITING/TIMED_WAITING → RUNNABLE
    触发条件
    WAITING:其他线程调用 notify()/notifyAll() 或发生中断。
    TIMED_WAITING:超时时间到或被唤醒。
    示例:线程调用 object.wait(5000),5秒后自动恢复。

  8. RUNNABLE → TERMINATED
    触发条件:线程正常执行完毕或抛出未捕获异常。


三、阻塞(BLOCKED)与等待(WAITING)的区别

维度BLOCKED(阻塞)WAITING(等待)
触发原因被动等待锁(竞争同步资源失败)。主动释放锁并等待条件(如调用 wait())。
锁状态未持有锁,等待获取锁。已释放锁,等待其他线程唤醒。
唤醒机制锁被释放时自动竞争。需其他线程显式唤醒(notify()/notifyAll())或中断。
典型场景多线程竞争同一同步块。生产者-消费者模型中的条件等待。
代码示例synchronized(obj) { ... } 竞争失败时。synchronized(obj) { obj.wait(); }

四、状态转换流程图

          start()
NEW ────────────────> RUNNABLE
                        │
                        │ 获取CPU时间片
                        ↓
                     RUNNING (操作系统层面)
                        │
                        │ 时间片用完/被抢占
                        ↓
                      RUNNABLE
                        │
                        ├─ 尝试获取锁失败 ────> BLOCKED
                        │
                        ├─ 调用 wait()/join() ──> WAITING
                        │
                        ├─ 调用 sleep(ms) ────> TIMED_WAITING
                        │
                        └─ 执行完成/异常 ─────> TERMINATED

五、关键总结

  1. BLOCKED 与 WAITING 的核心区别
    BLOCKED 是线程被动等待锁,未持有锁;WAITING 是线程主动释放锁后等待条件。
    BLOCKED 由锁竞争触发,WAITING 由显式调用等待方法触发。

  2. 状态转换的核心逻辑
    • 线程状态的切换依赖于锁机制、同步方法和操作系统调度。
    TIMED_WAITING 是带有超时的等待,可避免无限期阻塞。

  3. 实际应用建议
    • 避免过度使用 BLOCKED(如减少锁竞争),优先考虑无锁数据结构。
    • 使用 WAITINGTIMED_WAITING 实现线程协作时,需注意死锁和资源泄漏问题。

通过理解线程状态及其转换,开发者能更高效地设计并发程序,并快速定位死锁、资源竞争等问题。

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

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

相关文章

这是一个文章标题

# Markdown 全语法示例手册本文档将全面演示 Markdown 的语法元素,包含 **标题**、**列表**、**代码块**、**表格**、**数学公式** 等 18 种核心功能。所有示例均附带实际应用场景说明。---## 一、基础文本格式### 1.1 标题层级 markdown # H1 (使用 #) ## H2 (使用…

xtrabackup备份

安装: https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-30/binary/tarball/percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz?_gl1*1ud2oby*_gcl_au*MTMyODM4NTk1NS4xNzM3MjUwNjQ2https://downloads.perc…

(51单片机)串口通讯(串口通讯教程)(串口接收发送教程)

前言: 今天有两个项目,分别为: 串口接收: 串口发送: 如上图将文件放在Keli5 中即可,然后烧录在单片机中就行了 烧录软件用的是STC-ISP,不知道怎么安装的可以去看江科大的视频: 【51单片机入门…

redis 延迟双删

Redis延迟双删是一种用于解决缓存与数据库数据一致性问题的策略,通常在高并发场景下使用。以下是其核心内容: 1. 问题背景 当更新数据库时,如果未及时删除或更新缓存,可能导致后续读请求仍从缓存中读取旧数据,造成数…

大语言模型中的幻觉现象深度解析

一、幻觉的定义及出现的原因 1. 基本定义 ​​幻觉(Hallucination)​​ 指大语言模型在自然语言处理过程中产生的与客观事实或既定输入相悖的响应,主要表现为信息失准与逻辑矛盾。 2. 幻觉类型与机制 2.1 事实性幻觉 ​​定义​​:生成内容与可验证…

详解如何从零用 Python复现类似 GPT-4o 的多模态模型

🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…

大模型训练关键两步

大模型的核心原理是基于深度学习,通过多层神经网络进行数据建模和特征提取。目前大部分的大模型采用的是Transformer架构,它采用了自注意力机制,能够处理长距离依赖关系,从而更好地捕捉文本的语义和上下文信息。大模型还结合了预训…

前端面试宝典---创建对象的配置

Object.create 对整个对象的多个属性值进行配置 创建对象 不可更改属性值 // 创建对象 不可更改属性值 let obj Object.create({}, {name: {value: lisi,writable: false,},age: {value: 20,writable: true,} })console.log(初始化obj, obj) obj.name wangwu console.log(…

【设计模式】创建型 -- 单例模式 (c++实现)

文章目录 单例模式使用场景c实现静态局部变量饿汉式(线程安全)懒汉式(线程安全)懒汉式(线程安全) 智能指针懒汉式(线程安全)智能指针call_once懒汉式(线程安全)智能指针call_onceCRTP 单例模式 单例模式是…

共享内存(与消息队列相似)

目录 共享内存概述 共享内存函数 (1)shmget函数 功能概述 函数原型 参数解释 返回值 示例 结果 (2)shmat函数 功能概述 函数原型 参数解释 返回值 (3)shmdt函数 功能概述 函数原型 参数解释…

2025年常见渗透测试面试题- PHP考察(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 PHP考察 php的LFI,本地包含漏洞原理是什么?写一段带有漏洞的代码。手工的话如何发掘&am…

【C++进阶】关联容器:multimap类型

目录 一、multimap 基础概念与底层实现 1.1 定义与核心特性 1.2 底层数据结构 1.3 类模板定义 1.4 与其他容器的对比 二、multimap 核心操作详解 2.1 定义与初始化 2.2 插入元素 2.3 查找元素 2.4 删除元素 2.5 遍历元素 三、性能分析与适用场景 3.1 时间复杂度分…

远程管理命令:关机和重启

关机/重启 序号命令对应英文作用01shutdown 选项 时间shutdown关机 / 重新启动 一、shutdown shutdown 命令可以安全关闭 或者 重新启动系统。 选项含义-r重新启动 提示: 不指定选项和参数,默认表示 1 分钟之后 关闭电脑远程维护服务器时&#xff0…

【MySQL】001.MySQL安装

文章目录 一. MySQL在Ubuntu 20.04 环境安装1.1 更新软件包列表1.2 安装MySQL服务器1.3 配置安全设置1.4 检查mysql server是否正在运行1.5 进行连接1.6 查询自带的数据库 二. 配置文件的修改三. MySQL连接TCP/IP时的登陆问题四. MySQL中的命令 一. MySQL在Ubuntu 20.04 环境安…

vue 入门:组件事件

文章目录 vue介绍vue 入门简单示例自定义组件事件 vue介绍 vue2 官网 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层。 vue 入门 Vue.js 的核心是一个允许采用简洁的模板语…

数据质量问题中,数据及时性怎么保证?如何有深度体系化回答!

数据治理,数据质量这快是中大厂,高阶大数据开发面试必备技能,企业基于大数据底座去做数仓,那么首先需要保障的就是数据质量。 数据质量的重要性在现代企业中变得越发突出。以下是数据质量的几个关键方面,说明其对企业…

数据可视化 —— 折线图应用(大全)

一、导入需要的库 # Matplotlib 是 Python 最常用的绘图库,pyplot 提供了类似 MATLAB 的绘图接口 import matplotlib.pyplot as plt import numpy as np import pandas as pd 二、常用的库函数 plt.plot(x轴,y轴):plot()是画折线图的函数。 plt.xlabe…

什么是中性线、零线、地线,三相四线制如何入户用电

在变压器三相电侧,按照星形连接法,有一个中心点,这根线引出来的线接不接地:不接地就是中性线,接地就是零线 下面就是没有接地:中性线 接地了以后就可以叫做零线了 三相电在高压输电的时候是没有零线的&a…

【含文档+PPT+源码】基于Android家政服务系统的开发与实现

介绍视频: 课程简介: 本课程演示的是一款基于Android家政服务系统的开发与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.…

配置mac mini M4 的一些软件

最近更换了 mac mini M4 ,想要重新下载配置软件 ,记录一下。 Homebrew是什么? homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等功能。通过简单的指令可以实现包管理,而不用关心各种…