【JAVA多线程11】线程基本方法-线程等待(wait)/线程唤醒(notify)

2023-11-01

1、wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。

2、wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用,即,一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。

3、 由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说明当前线程一定是获取了锁的。

当线程执行wait()方法时候,会释放当前的锁,然后让出CPU,进入等待状态。

只有当 notify/notifyAll() 被执行时候,才会唤醒一个或多个正处于等待状态的线程,然后继续往下执行,直到执行完synchronized 代码块的代码或是中途遇到wait() ,再次释放锁。

也就是说,notify/notifyAll() 的执行只是唤醒沉睡的线程,而不会立即释放锁,锁的释放要看代码块的具体执行情况。所以在编程中,尽量在使用了notify/notifyAll() 后立即退出临界区,以唤醒其他线程 

4、wait() 需要被try catch包围,中断也可以使wait等待的线程唤醒。

5、notify 和wait 的顺序不能错,如果A线程先执行notify方法,B线程在执行wait方法,那么B线程是无法被唤醒的。

6、notify 和 notifyAll的区别

notify方法只唤醒一个等待(对象的)线程并使该线程开始执行。所以如果有多个线程等待一个对象,这个方法只会唤醒其中一个线程,选择哪个线程取决于操作系统对多线程管理的实现。notifyAll 会唤醒所有等待(对象的)线程,尽管哪一个线程将会第一个处理取决于操作系统的实现。如果当前情况下有多个线程需要被唤醒,推荐使用notifyAll 方法。比如在生产者-消费者里面的使用,每次都需要唤醒所有的消费者或是生产者,以判断程序是否可以继续往下执行。

7、在多线程中要测试某个条件的变化,使用if 还是while?

  要注意,notify唤醒沉睡的线程后,线程会接着上次的执行继续往下执行。所以在进行条件判断时候,可以先把 wait 语句忽略不计来进行考虑,显然,要确保程序一定要执行,并且要保证程序直到满足一定的条件再执行,要使用while来执行,以确保条件满足和一定执行。如下代码:

public class Test {
    //状态锁
    private Object lock;
    //条件变量
    private int now,need;
    public void produce(int num){
        //同步
        synchronized (lock){
           //当前有的不满足需要,进行等待
            while(now < need){
                try {
                    //等待阻塞
                    wait();
               

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【JAVA多线程11】线程基本方法-线程等待(wait)/线程唤醒(notify) 的相关文章

随机推荐

  • csdn大师孟岩老师为本书作序——“未来属于动态语言”

    如果你想掌握Ruby 这本书是最好的起点 如果你想运用Ruby 这本书也是案头必备 所以 如果你已经决定要走入Ruby的世界 那么这本书是必经之路 而本不需要一篇 推荐序 问题在于 我们为什么还要学习一种新的语言 特别是当Ruby整体上仍然
  • iOS编程中——id数据类型

    iOS编程中经常见到的 id 数据类型 id类型声明没有 号 是动态数据类型 可以指向任何类的对象 而不关心具体类型 编译阶段不做类型检查 运行阶段检查具体类型 优点 灵活 可以指向任何数据类型 编译阶段不指向任何类型 缺点 可读性不高 编
  • AR(制作流程)

    http blog csdn net yy763496668 article details 77806420 杨勇博客之家unity 80
  • Kafka or RabbitMQ:消息中间件选型深入分析

    一 前言 消息队列中间件 简称消息中间件 是指利用高效可靠的消息传递机制进行与平台无关的数据交流 并基于数据通信来进行分布式系统的集成 通过提供消息传递和消息排队模型 它可以在分布式环境下提供应用解耦 弹性伸缩 冗余存储 流量削峰 异步通信
  • 算法导论 学习笔记 第四章 递归

    n logba Theta n log b a lga Theta lga 这一章主要是介绍了三种求运行时间的方法 这三种方法都是解决递归问题的 就像分治法这种问题的算法的运行时间 这三种方法分别是替换法 递归树方法 主方法 4 1替换法
  • 对文件“\\.\PhysicalDrive1”的操作失败。

    用u盘给vm虚拟机安装系统时提示 因为前面添加了一个新的硬盘 既你的U盘 用来引导虚拟机进入系统启动盘 如果你在 可移动设备 中将选择 连接 断开与主机的连接 那么你的U盘就作为虚拟机的移动盘 U盘 而不是作为虚拟机的硬盘来处理 所以虚拟机
  • uni-app使用总结

    我在uni app遇到的问题 样式问题 1 组件和调用此组件的页面样式最好不要重名 不然会有样式覆盖问题 2 数据绑定变量的时候不能识别upx 可以转化 官网最新更正单位为rpx computed halfWidth return uni
  • 多版本node的安装和巧妙切换

    1 安装多版本node的原因 在项目开发过程中 不同项目使用的 node版本不同 有时会因为node版本过高或太低 导致报错 本文将教你如何在同一个系统中安装多个版本的node并且快速而且 巧妙地切换 2 安装指定版本的node 点击进入
  • Keil MDK的一些推荐功能(编码格式、自动保存、代码提示、动态语法检查、多核编译)

    一直在用Keil MDK开发 很多时候并没有仔细去研究它强大的功能 最近在做一些开源项目的同时也在想办法提高自己的工作效率 所谓时间就是金钱 看到世伟兄分享的这篇Keil MDK的笔记 正是我想要学习提升效率的 所谓前人种树 作为后人的我就
  • DAY39:贪心算法(七)根据身高重建队列(注意思路)+最少箭引爆气球(重叠区间)

    文章目录 406 根据身高重建队列 注意思路 思路 两个维度 降序排序注意点 完整版 vector容器插入相关复习 为什么能直接根据ki数值插入ki位置的下标 时间复杂度 vector insert操作存在的问题 链表优化版 时间复杂度 l
  • Zookeeper的功能以及工作原理

    1 ZooKeeper是什么 ZooKeeper是一个分布式的 开放源码的分布式应用程序协调服务 是Google的Chubby一个开源的实现 它是集群的管理者 监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作 最终 将简单易用
  • 2022年5月30日STM32——存储器 和 I2C读写EEPROM

    此内容仅是为了自己方便回忆 内容来源于野火指南者开发板教程 一 存储器 RAM Random Access Memory 随机存储器 当存储器中的消息被读取或写入时 所需要的时间与这段信息所在的位置无关 RAM分为动态随机存储器DRAM D
  • 再见以前说再见 操作系统复习

    mutex semget IPC PRIVATE 1 0666 IPC CREAT 创建信号量 semctl mutex 0 SETVAL 1 互斥信号量mutex赋初值为1 定义p操作 信号量申请操作 p sem num 0 p sem
  • 如何使用Python的Pyecharts做一个数据可视化的Graph 关系图?

    文章目录 前言 一 Pyecharts是什么 二 Graph关系图是什么 三 使用步骤 1 引入库 2 读入数据 3 人物关系 4 结果 总结 前言 Graph 关系图通常用于分析具有复杂性的数据 例如 如果你想探索不同实体之间的关系 你可
  • C# WinForm 默认最大化

    只需要在窗口的Shown事件处理函数中修改 WindowState即可 this WindowState FormWindowState Maximized
  • 事件绑定器-BP

    蓝图上的事件绑定器 在C 中就是代理 类似于这边绑定炸药包 那边爆炸 这个例子是 绑定人的F键 启动着火特效 书上的这个例子有问题 关卡蓝图上 核心在于startfire 事件 1 一边连接这绑定 一边连接着事件触发后的响应 先看第三人称绑
  • SpringBoot使用AOP

    本文介绍SpringBoot中使用Spring AOP 简介 AOP简介 AOP可能对于广大开发者耳熟能详 它是Aspect Oriented Programming的缩写 翻译成中文就是 面向切面编程 这个可能是面试中经常提到的问题 同时
  • 客服如何使用ChatGPT提高工作效率

    文章目录 ChatGPT简介 ChatGPT在客服中的应用 ChatGPT的优势和挑战 客服人员应该如何应对 1 与ChatGPT保持较高的专业水平 2 与ChatGPT建立良好的合作关系 3 强调人性化的服务 4 不断提升沟通和解决问题的
  • [前端] 编译时报错FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory

    参考文献 FATAL ERROR Reached heap limit Allocation failed JavaScript heap out of memory Vue cli3执行serve和build命令时nodejs内存溢出问题
  • 【JAVA多线程11】线程基本方法-线程等待(wait)/线程唤醒(notify)

    1 wait notify notifyAll 方法是Object的本地final方法 无法被重写 2 wait 使当前线程阻塞 前提是 必须先获得锁 一般配合synchronized 关键字使用 即 一般在synchronized 同步代