【线程有哪些状态?这些状态如何相互转换?阻塞和等待的状态有什么区别?】
线程状态及其转换与区别
线程的生命周期包含多个状态,不同状态之间的转换由线程调度和同步机制决定。以下是线程状态的详细说明、转换关系及阻塞与等待的区别:
一、线程的六种基本状态(以Java为例)
| 状态 | 描述 |
|---|---|
| NEW(新建) | 线程被创建但未启动(start() 尚未调用)。 |
| RUNNABLE(可运行) | 线程已启动,可能正在运行或等待CPU时间片(包含操作系统的就绪和运行状态)。 |
| BLOCKED(阻塞) | 线程因等待获取锁而无法进入同步块/方法(如其他线程持有锁)。 |
| WAITING(等待) | 线程主动进入无限期等待,需其他线程显式唤醒(如调用 wait()、join())。 |
| TIMED_WAITING(计时等待) | 线程在指定时间内等待(如 sleep(ms)、wait(timeout))。 |
| TERMINATED(终止) | 线程执行完毕或异常退出。 |
二、状态转换关系与触发条件
-
NEW → RUNNABLE
• 触发条件:调用start()方法启动线程。 -
RUNNABLE ↔ RUNNING(操作系统层面)
• 运行 → 就绪:时间片用完或被更高优先级线程抢占(由操作系统调度决定)。
• 就绪 → 运行:被操作系统调度选中,分配CPU时间片。 -
RUNNABLE → BLOCKED
• 触发条件:尝试进入同步块/方法时,锁已被其他线程持有。
• 示例:线程A持有锁,线程B尝试进入同步块时被阻塞。 -
RUNNABLE → WAITING
• 触发条件:调用无超时的wait()、join()或LockSupport.park()。
• 示例:线程调用object.wait()主动释放锁并进入等待队列。 -
RUNNABLE → TIMED_WAITING
• 触发条件:调用带超时的sleep(ms)、wait(timeout)或join(timeout)。
• 示例:线程调用Thread.sleep(1000)休眠1秒。 -
BLOCKED → RUNNABLE
• 触发条件:锁被释放(如持有锁的线程退出同步块)。
• 示例:线程A释放锁后,线程B成功获取锁并恢复执行。 -
WAITING/TIMED_WAITING → RUNNABLE
• 触发条件:
◦WAITING:其他线程调用notify()/notifyAll()或发生中断。
◦TIMED_WAITING:超时时间到或被唤醒。
• 示例:线程调用object.wait(5000),5秒后自动恢复。 -
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
五、关键总结
-
BLOCKED 与 WAITING 的核心区别:
• BLOCKED 是线程被动等待锁,未持有锁;WAITING 是线程主动释放锁后等待条件。
• BLOCKED 由锁竞争触发,WAITING 由显式调用等待方法触发。 -
状态转换的核心逻辑:
• 线程状态的切换依赖于锁机制、同步方法和操作系统调度。
•TIMED_WAITING是带有超时的等待,可避免无限期阻塞。 -
实际应用建议:
• 避免过度使用BLOCKED(如减少锁竞争),优先考虑无锁数据结构。
• 使用WAITING和TIMED_WAITING实现线程协作时,需注意死锁和资源泄漏问题。
通过理解线程状态及其转换,开发者能更高效地设计并发程序,并快速定位死锁、资源竞争等问题。
相关文章:
【线程有哪些状态?这些状态如何相互转换?阻塞和等待的状态有什么区别?】
线程状态及其转换与区别 线程的生命周期包含多个状态,不同状态之间的转换由线程调度和同步机制决定。以下是线程状态的详细说明、转换关系及阻塞与等待的区别: 一、线程的六种基本状态(以Java为例) 状态描述NEW(新建…...
netty中的ChannelPipeline详解
Netty中的ChannelPipeline是事件处理链的核心组件,负责将多个ChannelHandler组织成有序的责任链,实现网络事件(如数据读写、连接状态变化)的动态编排和传播。以下从核心机制、执行逻辑到应用场景进行详细解析: 1. 核心结构与组成 双向链表结构 组成单元:ChannelPipeline…...
Ubuntu 24.04 中文输入法安装
搜狗输入法,在Ubuntu 24.04上使用失败,安装教程如下 https://shurufa.sogou.com/linux/guide 出现问题的情况,是这个帖子里描述的: https://forum.ubuntu.org.cn/viewtopic.php?t493893 后面通过google拼音输入法解决了&#x…...
踩雷,前端一直卡在获取token中
问题:一直卡在var token SecureStorage.Default.GetAsync("auth_token").Result; public VideoService(){_httpClient new HttpClient();var token SecureStorage.Default.GetAsync("auth_token");} 这是一个典型的同步等待异步操作导致的死…...
这是一个文章标题
# 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 事实性幻觉 定义:生成内容与可验证…...
App的欢迎页,以及启动黑屏的问题
1、在styles.xml文件中配置:<style name"WelcomePageStyle" parent"style/Theme.AppCompat.Light.NoActionBar"><item name"android:windowBackground">mipmap/icon_welcome_bg</item><item name"android:…...
各种颜色空间的相互转换方法(RGB,HSV,CMYK,灰度)
各个颜色空间原始值的取值范围: RGB:[0,255] H:[0,360],S:[0,1],V:[0,1] CMYK:[0,1] 灰度:[0,255] 以下给出各个颜色空间转换的伪代码。 RGB转HSV rR/255 gG/255 b…...
详解如何从零用 Python复现类似 GPT-4o 的多模态模型
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
大模型训练关键两步
大模型的核心原理是基于深度学习,通过多层神经网络进行数据建模和特征提取。目前大部分的大模型采用的是Transformer架构,它采用了自注意力机制,能够处理长距离依赖关系,从而更好地捕捉文本的语义和上下文信息。大模型还结合了预训…...
当算力遇上脑科学:破解意识上传的算力密码
目录 一、人脑复刻面临的三座大山 二、自然科学之外的三大麻烦 三、未来发展的三种可能结局 没有人的文明还是文明吗? 最近,全球首例"数字永生"官司闹得沸沸扬扬——美国富豪家属指控科技公司造假,而马斯克却宣布脑机接口芯片升级到第9代。科学家们算了一…...
前端面试宝典---创建对象的配置
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 分钟之后 关闭电脑远程维护服务器时࿰…...
塑造现代互联网的力量:Berkeley在网络领域的影响与贡献
引言 “Berkeley” 这个名字在计算机网络和互联网领域中具有举足轻重的地位,许多关键的技术、协议和工具都与其紧密相关。它与 加利福尼亚大学伯克利分校(UC Berkeley) 密切相关,该校在计算机科学与网络研究中做出了许多开创性的…...
【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…...
自启动应用程序配置之etc/xdg/autostart
在 Linux 系统中,/etc/xdg/autostart/ 目录用于存放系统级的自动启动项(.desktop 文件)。这些文件遵循 FreeDesktop.org 的规范,定义了应用程序在用户登录时自动启动的规则。 系统级 vs 用户级自动启动 系统级&a…...
在 Linux 系统(ubuntu/kylin)上安装 Docker
在 Linux 系统上安装 Docker 的步骤如下(以 Ubuntu/Debian 和 CentOS/RHEL 为例): 请用./check-config config检查内核是否支持,necessarily 必须全部enable。 以下是脚本自行复制运行: #!/usr/bin/env sh set -eEXITCODE=0# bits of this were adapted from lxc-checkco…...
【含文档+PPT+源码】基于Android家政服务系统的开发与实现
介绍视频: 课程简介: 本课程演示的是一款基于Android家政服务系统的开发与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.…...
SpringBoot + Netty + Vue + WebSocket实现在线聊天
最近想学学WebSocket做一个实时通讯的练手项目 主要用到的技术栈是WebSocket Netty Vue Pinia MySQL SpringBoot,实现一个持久化数据,单一群聊,支持多用户的聊天界面 下面是实现的过程 后端 SpringBoot启动的时候会占用一个端口ÿ…...
