并发编程-线程等待唤醒机制

news2024/11/18 10:36:37

目录

前言

​编辑

线程等待和唤醒的方法 

wait() 方法:

notify() 方法:

注意事项和建议:

我的其他博客


前言

程等待唤醒机制是多线程编程中用于线程之间协调和通信的一种机制。在多线程环境中,有时候一个线程需要等待某个条件满足,而另一个线程则需要在某个条件满足时通知其他线程。

线程等待和唤醒的方法 

在Java中,线程等待和唤醒的方法通常是通过 Object 类的 wait(), notify(), 和 notifyAll() 方法来实现的。这些方法必须在同步块或同步方法中使用,因为它们依赖于对象的锁机制。

wait() 方法:

  • 使当前线程进入等待状态,同时释放对象的锁。
  • 调用 wait() 后,线程会等待被其他线程通过 notify()notifyAll() 方法唤醒。
  • 在等待期间,线程可以被中断(通过 interrupt() 方法),也可以在等待一定时间后自动唤醒(通过带有超时参数的 wait(long timeout) 方法)。
    synchronized (sharedObject) {
        while (conditionIsNotMet) {
            sharedObject.wait();
        }
        // 执行等待后的操作
    }
    

    notify() 方法:

  • 唤醒在此对象上等待的一个线程。
  • 如果有多个线程在等待,notify() 方法会选择其中一个线程唤醒,但是无法确定是哪一个。
  • 调用 notify() 后,被唤醒的线程将尝试重新获得对象的锁。
    synchronized (sharedObject) {
        // 满足条件后,通知等待的线程
        sharedObject.notify();
    }
    

    notifyAll() 方法:

  • 唤醒在此对象上等待的所有线程。
  • 使用 notifyAll() 会唤醒所有等待的线程,这样它们都有机会争夺对象的锁。
    synchronized (sharedObject) {
        // 满足条件后,通知等待的所有线程
        sharedObject.notifyAll();
    }
    

    在上述代码中,sharedObject 是共享对象,多个线程在这个对象上进行同步。wait() 方法会使线程释放对象的锁,然后等待其他线程唤醒。notify()notifyAll() 方法用于在满足某个条件时通知等待的线程,使其重新竞争锁。

注意事项和建议:

  1. 防止虚假唤醒: 在等待的时候,通常需要在循环中检查条件,以防止虚假唤醒。

    synchronized (sharedObject) {
        while (conditionIsNotMet) {
            sharedObject.wait();
        }
        // 某个条件满足后的操作
    }
    

  2. 调用顺序: 调用 wait() 方法的线程会释放对象的锁,而调用 notify()notifyAll() 的线程会尝试重新获得对象的锁。

  3. 合理使用 notifyAll() 在使用 notifyAll() 时,需要考虑唤醒的线程是否真的需要被唤醒,以避免不必要的性能开销。

  4. 避免死锁: 当设计线程等待唤醒机制时,需要注意避免死锁的情况,确保线程能够正确释放和获取锁。

  5. 示例代码:

    class SharedResource {
        private boolean condition = false;
    
        synchronized void waitForCondition() throws InterruptedException {
            while (!condition) {
                wait();
            }
            // 某个条件满足后的操作
        }
    
        synchronized void signalCondition() {
            condition = true;
            notifyAll();  // 或 notify(),唤醒等待的线程
        }
    }
    

    上述代码中,waitForCondition 方法用于等待条件满足,而 signalCondition 方法用于设置条件并唤醒等待的线程。这是一个简单的示例,实际应用中,需要根据具体场景设计合适的等待唤醒机制。

我的其他博客

简单介绍一些其他的树-CSDN博客

认识二叉树(详细介绍)-CSDN博客

正则表达式详细讲解-CSDN博客

低代码开发:创新之道还是软件开发的捷径?-CSDN博客

HTTP与HTTTPS的区别-CSDN博客

什么情况下会产生StackOverflowError(栈溢出)和OutOfMemoryError(堆溢出)怎么排查-CSDN博客

在多线程中sleep()和wait()的区别(详细)-CSDN博客

谈谈我对HashMap扩容机制的理解及底层实现-CSDN博客

堆排序详细讲解(一文足矣JAVA)-CSDN博客

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

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

相关文章

ResourceSat2卫星数据下载

印度5米遥感卫星数据开放下载 简介 印度国家遥感中心( NRSC )于近期开放了ResourceSat2卫星的LISS4传感器的数据下载权限,最高分辨率为5米。此次可供下载的有3个波段(近红外/红/绿),下载附带3个GeoTIFF和一个元数据文件&#xf…

OpenCV极坐标变换函数warpPolar的使用

学更好的别人, 做更好的自己。 ——《微卡智享》 本文长度为1702字,预计阅读4分钟 前言 前阵子在做方案时,得了几张骨钉的图片,骨科耗材批号效期管理一直是比较麻烦的,贴RFID标签成本太高,所以一般考虑还是…

大数据技术之Hive(超级详细)

第1章 Hive入门 1.1 什么是Hive Hive:由Facebook开源用于解决海量结构化日志的数据统计。 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。 本质是:将HQL转化成MapReduce程序 …

微信小程序使用camera扫码获取相机权限

确保用户隐私指引已经明确使用相机功能 “mp-weixin”: "permission": {"scope.camera": {"desc": "需要使用相机功能,请授权"}}wx.authorize({scope: scope.camera,success(res) {console.log(res, 用户成功授权)// 用户…

在Node.js中MongoDB插入数据的方法

本文主要介绍在Node.js中MongoDB插入数据的方法。 目录 Node.js中MongoDB插入数据使用MongoDB原生驱动插入数据使用Mongoose插入数据 Node.js中MongoDB插入数据 在Node.js中,可以使用MongoDB原生驱动或Mongoose库来连接和操作MongoDB数据库。 以下是在Node.js中使用…

【洛谷算法题】P1422-小玉家的电费【入门2分支结构】

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P1422-小玉家的电费【入门2分支结构】🌏题目描述🌏输入格…

医学检验系统LIS源码,C# +.Net+Oracle

LIS是HIS的一个组成部分,通过与HIS的无缝连接可以共享HIS中的信息资源,使检验科能与门诊部、住院部、财务科和临床科室等全院各部门之间协同工作。  体系结构:Client/Server架构 客户端:WPFWindows Forms 服务端:C…

【网络安全】Suspicious DNS Query(可疑的DNS查询)

文章目录 名词解释可能原因分析Action sinkhole在防火墙里面查询Suspicious DNS Query预防Suspicious DNS查询带来的风险推荐阅读 名词解释 “Suspicious DNS Query(可疑的DNS查询)”通常指的是在网络中检测到的可能具有风险或异常行为的DNS&#xff08…

在国内,现在月薪1万是什么水平?

看到网友发帖问:现在月薪1W是什么水平? 在现如今的情况下,似乎月薪过万这个标准已经成为衡量个人能力的一个标准了,尤其是现在互联网横行的时代,好像年入百万,年入千万就应该是属于大众的平均水平。 我不是…

电子秤ADC芯片CS1237技术资料问题合集

问题11:实际应用中,多个称重传感器应该怎么与ADC连接? 解答:如果传感器是测量同一物体(例如:厨房垃圾处理器),一般建议使用并联的方式。则相同类型的信号线连接在一起。对于传感器的…

stateflow 之图函数、simulink函数和matlab函数使用及案例分析

目录 前言 1. 图函数graph function 2.simulink function 3.matlab function 4.调用stateflow中的几种函数方式 前言 对于stateflow实际上可以做simulink和matlab的所有任务,可以有matlab的m语言,也可以有simulink的模块,关于几种函数在…

python自动化测试实战 —— CSDN的Web页面自动化测试

软件测试专栏 感兴趣可看:软件测试专栏 自动化测试学习部分源码 python自动化测试相关知识: 【如何学习Python自动化测试】—— 自动化测试环境搭建 【如何学习python自动化测试】—— 浏览器驱动的安装 以及 如何更…

《算法竞赛入门到进阶》——图论

10.1 图的基本概念(P214) 10.2 图的存储(P215) 10.3 图的遍历和连通性(P217) bfs 和 dfs 。 10.4 拓扑排序(P219) 一个图能进行拓扑排序的充要条件是它是一个有向无环图。 算法…

大数据----31.hbase安装启动

二.Hbase安装 先前安装: Zookeeper 正常部署 首先保证 Zookeeper 集群的正常部署,并启动之。 三台机器都执行:zkServer.sh startHadoop 正常部署 Hadoop 集群的正常部署并启动。 主节点上进行 :start-all.sh 1.HBase 的获取 一定…

AUTOSAR_SWS_LogAndTrace文档中文翻译

1 Introduction and functional overview 本规范规定了AUTOSAR自适应平台日志和跟踪的功能。 日志和跟踪为AA提供接口,以便将日志信息转发到通信总线、控制台或文件系统。 提供的每个日志记录信息都有自己的严重性级别。对于每个严重级别,都提供了一个单…

风速预测(三)EMD-LSTM-Attention模型

目录 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集,按照8:2划分训练集和测试集 2.2 设置滑动窗口大小为7,制作数据集 3 基于Pytorch的EMD-LSTM-Attention模型预测 3.1 数据加载&#…

【数据结构】什么是堆?

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 堆的概念及结构 堆的定义如下: n个元素的序列{k1,k2,...,kn}当且仅当满足以下关系时,称之为堆. 或 把这个序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个…

贪心算法:K次取反后最大化的数组和 加油站 分发糖果

1005.K次取反后最大化的数组和 思路: 如果数组中有负数的话,优先把较小那些的负数取反变成整数;如果没有负数了,而k的次数还有剩,只对最小的正数反复做取反,即使这个数最后变成了负数,也是能取…

HarmonyOS使用Web组件

Web组件的使用 1 概述 相信大家都遇到过这样的场景,有时候我们点击应用的页面,会跳转到一个类似浏览器加载的页面,加载完成后,才显示这个页面的具体内容,这个加载和显示网页的过程通常都是浏览器的任务。 ArkUI为我…

ARCGIS 中使用 ChatGPT 的 5 种方式

ChatGPT 一度成为最热门的话题。什么是 ChatGPT?谁能比 ChatGPT 本身更好地回答这个问题呢?我们要求它写一个关于 ChatGPT 是什么的简短描述,这是它的回应: ChatGPT 是一个聊天机器人,使用 OpenAI 开发的 GPT-3 语言模…