线程的等待通知机制

等待通知机制

之前所学到的join是等待线程结束,而此时的等待通知,等待代码给我们提示进行显示的通知(并不一定要结束),可以更加精细控制线程之间的执行顺序,在系统内部,线程是抢占式执行,随机调度,但是程序员也是有手段可以进行干预的,我们可以通过"等待"的方式让线程按照咱们预期来执行,无法主动让某个线程被调度,可以让某个线程被等待.

线程饿死问题

一个线程频繁的获取释放锁,由于获取的太空,以至于其他线程无法获取cpu资源,等待通知机制就可以解决上述机制,通过条件判断,当前逻辑是否能够执行,如果不能执行就主动wait等待(主动进行阻塞),把执行线程的机会让给别的线程,就可以避免一些无意的重试.等到时机成熟了(其他线程的通知)在让阻塞的线程被唤醒.

关于wait()和notify()方法

wait是Object所提供的方法,所以的类都会有这个方法

wait和sleep一样都是会被Interrupt打断,也能够自动清除标志位,也有超时间就会自动唤醒,不会死等

这个报错提示中的Monitor指的就是synchronized,其在jvm中涉及的术语就是monitor(也叫监视器锁)

wait内部做的事情不仅仅是阻塞等待,还要解锁,准确来说是解锁同时进行等待,然后解锁的前提是加锁,所以wait必须放在synchronized里面使用

此时就会成功阻塞等待,当执行到wait操作时,在wait内部会先解锁,此时object这个锁其他线程是可以获取到的,wait释放锁之后会休息自己不参与调度,把机会让给别人,什么时候开始执行,此时就需要notify()方法,跟wait()配合使用,其他线程通过使用notify将wait唤醒,使用notify的线程必须跟使用wait的线程锁是同一把锁.

t2把t1唤醒之后,并不能立即执行,t1需要重新获取锁,由于此时t2还没有结束,t1无法获取到锁被阻塞,所以需要等到t2释放锁以后,t1才能继续执行

t2执行notify之后会将wait()唤醒,此时t1的线程从WAITING->RUNNABLE,,但是由于t2还没有将锁释放,而t1t2都是同一把锁,所以t1状态变为BLOCK,等到t2的代码块执行完毕以后,t1的线程状态变为RUNNABLE,在执行线程中的内容,所以此时会看到t2先执行完才执行t1

如果此时先执行t2然后在sleep一下,t1就会阻塞等待,因为当t2执行完notify之后,t1执行wait之后没有方法可以将其唤醒,所以会阻塞等待

多线程代码总是充满随机性,只要代码变了一点,就会充满不同,notify()只可以随机唤醒一个线程,如果要准确对应唤醒线程,必须确保notify和wait的锁对象是一样的,这样就可以准确的唤醒.notifyAll()该方法可以唤醒所有wait()线程前提是跟这个方法锁对象一样的

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

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

相关文章

【学术日记】关于读博,目标院校,意向导师,毕业要求,重要时间点

文章目录 一、目标院校二、重要时间点西安交通大学意向导师 华南理工大学意向导师 本文记录博主的科研日记。如果对博主的其他文章感兴趣,可以看这篇文章【CSDN文章】晚安66博客文章索引。 首次修改时间:2024年5月12日。当前修改时间:2024年5…

C : 线性规划例题求解

Submit Page TestData Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 93 Solved: 49 Description 求解下述线性规划模型的最优值min �1�1�2�2�3�3�.�. &…

Spring Cloud LoadBalancer基础入门与应用实践

官网地址:https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html 【1】概述 Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器,它包含在SpringCloud-commons中用…

前端vue使用onlyoffice控件实现word在线编辑、预览(仅列出前端部分需要做的工作,不包含后端部分)

简介 ONLYOFFICE 文档 是一个开源办公套件,包括文本文档、电子表格、演示文稿和可填写表单的编辑器。 它提供以下功能: 创建、编辑和查看文本文档、电子表格、演示文稿和可填写表单; 与其他队友实时协作处理文件。 基于这个控件,…

基于Java毕业生生活用品出售网站的设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,…

【算能全国产AI盒子】基于BM1688CV186AH+FPGA智能物联工作站,支持差异化泛AI视觉产品定制

在数据呈现指数级增长的今天,越来越多的领域和细分场景对实时、高效的数据处理和分析的需求日益增长,对智能算力的需求也不断增强。为应对新的市场趋势,凭借自身的硬件研发优势,携手算能相继推出了基于BM1684的边缘计算盒子&#…

MySQL3(多表联查 子查询 流程控制函数,语句 Sql 执行顺序 学生选课表练习)

目录 一、多表联查 1. 等值查询和非等值查询 等值查询 --- 主外键相等 ​编辑非等值查询 2. 连接查询 ​编辑 内连接 ​编辑 左外连接 ​编辑 右外连接 3. UNION 二、子查询 1. where 型子查询: 2. from型子查询: 3. exists型子查询: 4. any, some…

笔记本重装系统怎么操作? windows电脑重装系统,超实用的四种方法

重新安装操作系统是维护计算机性能和确保系统稳定运行的重要步骤。对于 Windows 笔记本用户而言,熟悉重装系统的方法可以帮助他们解决各种问题,从提高系统速度到修复软件故障。然而具体来讲,笔记本重装系统怎么操作呢?接下来&…

LLDP 基本原理

LLDP 简介 定义 LLDP(Link Layer Discovery Protocol,链路层发现协议)是 IEEE 802.1ab 中定义的第二层发现(Layer 2 Discovery)协议。 LLDP 提供了一种标准的链路层发现方式,可以将本端设备的主要能力、…

单片机使用printf在串口输出字符串

把字符串使用printf输出的本质 实际上调用了putchar和串口字符输出函数,参考 以51单片机中的程序为例 在主函数中使用printf函数向串口发送字符串,当然保证已经定义好串口的波特率等参数 while(1){//uart0SendString("start....\n");prin…

服务器巡查脚本

脚本编程步骤 脚本编程一般分为以下几个步骤: 需求分析:根据系统管理的需求,分析脚本要实现的功能、功能实现的层次、实现的命令与语句等; 命令测试,将要用到的命令逐个进行测试,以决定使用的选项要设置…

新书速览|解密AI绘画与修图: Stable Diffusion+Photoshop

《解密AI绘画与修图: Stable DiffusionPhotoshop》 本书内容 《解密AI绘画与修图:Stable DiffusionPhotoshop》全面介绍了Photoshop和Stable Diffusion的交互方式,以及各自的AI功能和具体使用方法。除了讲解功能,还通过实际案例加…

SpringBoot防抖方案(防止表单重复提交)

SpringBoot防抖方案(防止表单重复提交) 1.应用场景(什么是防抖) 所谓防抖,一是防用户手抖,二是防网络抖动。在Web系统中,表单提交是一个非常常见的功能,如果不加控制,容…

深度遍历-牛牛的果实迷宫

目录 一、问题描述 二、解题思路 1.返回格式 2.使用深度遍历 3.注意上下左右的实现方式 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 1.返回格式 这个题目的问题返回格式是Point(x,y);x代表最短路径距离,y表示最短路径数量 如果没有…

Linux中的库

什么是库? 库是一组预先编译好的方法/函数的集合,其他程序想要使用源文件中的函数时,只需在编译可执行程序时,链接上该源文件生成的库文件即可。 库分为两类:静态库和动态库 在Linux系统中,以.a为后缀的…

Animate软件基础:删除图层或文件夹

Animate软件中,图层或者图层文件夹同样可以进行删除操作,不过需要注意的是,删除图层或者删除文件夹,都会将其中所有的内容删除。 要选择图层或文件夹,可以单击时间轴中该图层或文件夹的名称,或者单击图层中…

2-自动驾驶关键技术框架

框架 来自《自动驾驶汽车决策与控制》这本书 三大技术 车载平台的关键技术: 环境感知技术:这是自动驾驶车辆能够“看”和“感知”周围世界的技术。它包括使用摄像头、雷达、激光雷达(Lidar)和超声波传感器来检测和识别道路、障…

ZYNQ MPSOC烧写问题记录

1、如果带有ARM代码,则ZYNQ MPSOC烧写的烧写是通过ViTIS进行的,通过JTAG模式进行烧写,如下图的PS_MODEx配置成0000,这个只与硬件相关,硬件拉高拉低。 2、如果不带ARM代码,则烧写过程与前版本一致。

新手做ASO优化必须要了解的8大指标

在进行 ASO 优化时,以下这些指标通常应优先考虑: 1. 关键词排名 - 这是衡量 ASO 效果的关键指标之一。了解您的应用在特定关键词搜索结果中的位置,有助于评估优化策略的有效性。 2. APP下载量 - 直接反映了应用的受欢迎程度和ASO工作对吸…

ONLYOFFICE8.1版本桌面编辑器——功能测评

一、编辑DOCX 相信大家都有写word文档的经历,不知道大家是不是跟我一样,感觉做一个word不难,但想做好一个word却很麻烦,功能太多,看的人眼花缭乱,有时候一个功能要找很久,甚至有的功能用一辈子都…