多线程教程(十一)waitnotify的正确使用

Isaacgym使用操作指南 Isaac Gym 是一个强大的仿真工具,特别适合那些需要进行大规模并行仿真和训练的机器人和强化学习任务。通过 GPU 加速、深度学习集成和丰富的物理仿真能力,Isaac Gym 能够显著提高仿真和训练效率,是机器人学和 AI 研究中的一大利器。 阅读详情

多线程教程(十一)wait/notify的正确使用

一、基础API介绍

wait/notify是object的方法

  1. obj.wait() 让进入 object 监视器的线程到 waitSet 等待
  2. obj.notify() 在 object 上正在 waitSet 等待的线程中挑一个唤醒
  3. obj.notifyAll() 让 object 上正在 waitSet 等待的线程全部唤醒

它们都是线程之间进行协作的手段,都属于 Object 对象的方法。必须获得此对象的锁,才能调用这几个方法

wait() 方法会释放对象的锁,进入 WaitSet 等待区,从而让其他线程就机会获取对象的锁。无限制等待,直到notify 为止

wait(long n) 有时限的等待, 到 n 毫秒后结束等待,或是被 notify

sleep(long n) 和 wait(long n) 的区别

  1. sleep 是 Thread 方法,而 wait 是 Object 的方法
  2. sleep 不需要强制和 synchronized 配合使用,但 wait 需要和 synchronized 一起用
  3. sleep 在睡眠的同时,不会释放对象锁的,但 wait 在等待的时候会释放对象锁
  4. 它们状态都是 TIMED_WAITING,去掉long之后就是WAITING
二、wait/notify的正确使用方法

正确方法可以直接看step5,前面为引导步骤

step5
public class TestCorrectPostureStep5 {
    static final Object room = new Object();
    static boolean hasCigarette = false;
    static boolean hasTakeout = false;

    public static void main(String[] args) {


        new Thread(() -> {
            synchronized (room) {
                log.debug("有烟没?[{}]", hasCigarette);
                while (!hasCigarette) {
                    log.debug("没烟,先歇会!");
                    try {
                        room.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                log.debug("有烟没?[{}]", hasCigarette);
                if (hasCigarette) {
                    log.debug("可以开始干活了");
                } else {
                    log.debug("没干成活...");
                }
            }
        }, "小南").start();

        new Thread(() -> {
            synchronized (room) {
                Thread thread = Thread.currentThread();
                log.debug("外卖送到没?[{}]", hasTakeout);
                while (!hasTakeout) {
                    log.debug("没外卖,先歇会!");
                    try {
                        room.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                log.debug("外卖送到没?[{}]", hasTakeout);
                if (hasTakeout) {
                    log.debug("可以开始干活了");
                } else {
                    log.debug("没干成活...");
                }
            }
        }, "小女").start();

        sleep(1);
        new Thread(() -> {
            synchronized (room) {
                hasTakeout = true;
                log.debug("外卖到了噢!");
                room.notifyAll();
            }
        }, "送外卖的").start();


    }

}

输出:

20:58:34.322 [小南] c.TestCorrectPosture - 有烟没?[false] 
20:58:34.326 [小南] c.TestCorrectPosture - 没烟,先歇会!
20:58:34.326 [小女] c.TestCorrectPosture - 外卖送到没?[false] 
20:58:34.326 [小女] c.TestCorrectPosture - 没外卖,先歇会!
20:58:35.323 [送外卖的] c.TestCorrectPosture - 外卖到了噢!
20:58:35.324 [小女] c.TestCorrectPosture - 外卖送到没?[true] 
20:58:35.324 [小女] c.TestCorrectPosture - 可以开始干活了
20:58:35.324 [小南] c.TestCorrectPosture - 没烟,先歇会!

使用wait/notify需要注意的几点问题

1.使用while让wait循环执行,防止被其他线程唤醒,但条件并不满足

2.使用notifyAll来唤醒所有等待线程,因为可能有多个线程在等待,使用notify是随机唤醒一个线程

简化版的使用模板

synchronized(lock) {
    while(条件不成立) {
        lock.wait();
    }
    // 干活
}
//另一个线程
synchronized(lock) {
    lock.notifyAll();
}

实际上这是个简单的调用,后面还会有其他优化,具体使用还要考虑线程安全的一些其他问题。

用一台笔记本跑起 SAP HANA:从 express edition 的定位,到本地硬件门槛与安装实操 SAP HANA是面向个人开发者、初创团队与教学科研场景的精简发行版,保留了in-memory列存引擎、SQLScriptAFLGraphSpatial等核心能力,可免费用于开发与一定规模的生产用途(上限为 32 GB RAM)。它最大的特征,是能在资源受限的laptop或上快速落地,让你在本地完成从建模、开发到测试的完整闭环。SAP在交付形态上,提供了多种安装包:预配置的VM OVA、面向Linux的二进制安装包,以及历史上出现过的容器化方案;你可以按现有设备与熟悉的运维方式择优选择。官方文档把VM。 阅读详情

相关推荐

VideoPose3d:环境搭建+制作自己的视频

论文链接:3D human pose estimation in video with temporal convolutions and semi-supervised training 代码链接:https://github.com/facebookresearch/VideoPose3D 环境搭建:ubuntu20.04+pytorch1.8+cuda10.2+python3.6+anaconda 1.启动anaconda环境 新建环境命令: conda create -n pytorc.

willbetter01的博客 4938

Java之wait()和notify()实例讲解

Object对象的wait()和notify(): wait:导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法,该方法是会释放锁的。 notify:唤醒正在等待对象监视器的单个线程。 如果任何线程正在等待这个对象,其中一个被选择被唤醒。 选择是任意的,并且由实施的判断发生。 线程通过调用wait方法之一等待对象的监视器。 该方法不释放锁的。 wait和n...

玻璃汽水的博客 1804

信道估计之MMSE算法

信道估计之MMSE算法前言MMSE估计的原理总结 前言        前篇分析了LS信道估计算法,也说明了由于没有考虑SNR的影响,所以LS算法不适合在低信噪比的情况下使用。本篇来学习信道估计的另外一种常用的算法–MMSE。        为什么说LS没有考虑噪声大小的情况呢,因为LS算法使用的是实际观测量与估计观测量的误差,这并不能精确的代表估计量的真值与估计值的误

大白的博客 2万+

Java多线程之wait和notify的使用

在前面我们已经介绍过了join()方法可以用来控制线程的执行顺序了,但是join()却只能让整个线程执行结束再去执行另外的线程。控制线程执行顺序的效果是有限的,因此又有了wait()和notify(),目的其实都是为了控制程序的执行顺序的。本篇博客就主要来介绍wait()和notify()的使用。wait()方法其实主要做三件事:①把当前线程放进等待队列中②释放锁③被其他线程唤醒时,尝试重新获取锁接下来看一段问题代码:System.out.println("wait()之前");

m0_64986499的博客 968

手把手教你配置SAP EWM HU类型及号段分配(含常见错误排查)

本文详细介绍了SAP EWM系统中HU类型及号段分配的配置方法,包括环境准备、包材主数据配置、存储类型关联及号段管理。通过实战案例和常见错误排查,帮助用户高效完成HU配置,提升仓储管理效率。重点讲解了EWM后台配置和号段配置的关键步骤与技巧。

weixin_33670786的博客 443

GD32F303串口DMA发送数据避坑指南:为什么你的发送函数会卡住?

本文深入解析GD32F303单片机串口DMA发送数据时常见的卡死问题,提供详细的避坑指南。从DMA传输完成中断时序、发送状态管理到双通道DMA的特别注意事项,全面剖析问题根源并给出解决方案,帮助开发者构建健壮的DMA发送机制。

weixin_27038245的博客 295

java基础总结(二十四)--wait与notify使用实例

1wait(), notify(), notifyAll()等方法介绍 1.wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”) 2.notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒...

秋天的猿 701

MIPI video mode 和 command mode 的区别

1、何为LCD RAM? LCD 是指字面意思是液晶显示屏(Liquid Crystal Display), 而RAM: 随机存取存储器(Random-Access Memory),两者完全是风马牛不相及的东西。 下图是一个标准的LCD的爆炸图(不含TP),请注意图中红色mark的地方:控制IC-- LCD的大脑。所谓的LCD RAM自然是指此大脑是否包含RAM. 题外话<不感兴趣的...

精诚所至 4690

8.多线程(5) --- wait和notify的使用

上一个博客中我们学习volatile关键字,这个博客中我们学习wait和notify。wait 是 等待,notify是通知。使用这两个方法,可以让后执行的逻辑,等待先执行的逻辑先执行,虽然无法直接干预调度器的调度顺序,但是可以让后执行的逻辑(线程)等待,等待到先执行的逻辑跑完,通知一下当前的线程,让他继续执行。

xxhh156的博客 2041

TriCore架构-基于TC397的启动流程

TC397芯片的启动流程分为三个关键阶段:固件启动(BootFirmware)、Bootloader引导和应用程序启动。BootFirmware作为硬件信任根,包含SSW基础初始化、CHSW自检和BSL应急刷写通道。Bootloader承担安全验证和程序引导功能,支持双分区(AB-SWAP)和双引导方案(PBL/SBL)。安全启动通过校验机制确保软件完整性,提供三种可选技术方案。应用程序启动阶段实现软件双分区管理,支持SOTA更新。整个流程体现了汽车电子系统的安全设计理念,通过硬件级保护与软件验证相结合确保

xiandang8023的博客 987

RK3568平台(网络篇)WIFI模块RTL8821CU调试

RTL8821CU是瑞昱半导体推出的usb接口的wifi,下面的教程将介绍如何将RTL8821CU移植到rk3588的平台上。移植usb wifi需要修改的文件Android hal层需要修改的文件//kernel需要修改的文件kernel/arch/arm64/boot/dts/rockchip/rk3399-tve1030g.dtsi //除去板上的sdio的wifi。

weixin_49303682的博客 3905

java多线程wait/notify练习案例:线程通信

java多线程wait/notify练习案例:线程通信 制作两个线程对象,要求用同步块的方式使第一个线程运行2次,然后将自己阻塞起来,唤醒第二个线程,第二个线程再运行2次,然后将自己阻塞起来,唤醒第一个线 程……两个线程交替执行。 public class Demo { public static void main(String[] args) { byte[] bytes = new byte[0]; new Thread(() -> {

512

社交媒体文章内容与评论抓取:Python 爬虫实战教程

通过本文的介绍,我们学习了如何使用 Python 编写爬虫,抓取社交媒体平台的文章内容和评论。我们详细介绍了如何使用requestsSelenium和Tweepy等工具,抓取微博和 Twitter 上的公开数据。同时,我们还讨论了如何处理反爬虫机制,避免账号或 IP 被封禁。抓取社交媒体数据是一个充满挑战和乐趣的过程,掌握这些技术后,你可以在大数据分析、情感分析和舆情监测等方面得到更深层次的应用。

2201_76125261的博客 1710

Java多线程:waitnotify原理剖析

Java多线程wait/notify原理

大数据开发、JAVA开发、人工智能AI 654

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

多线程教程(十) waitnotify原理

多线程教程(十) wait/notify原理 一、为什么需要wait/notify 由于条件不满足,小南不能继续进行计算 但小南如果一直占用着锁,其它人就得一直阻塞,效率太低 于是老王单开了一间休息室(调用 wait 方法),让小南到休息室(WaitSet)等着去了,但这时锁释放开,其它人可以由老王随机安排进屋 直到小M将烟送来,大叫一声 [ 你的烟到了 ] (调用 notify 方法) 小南于是可以离开休息室,重新进入竞争锁的队列 总结来说,就是在线程持有锁的时候,有时

qq_30491663的博客 418

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

waitNotify

package Thread; import java.io.Serializable; /** * *功能说明: * 1. 线程 ABC, 锁 lock AB在lock上等待,C唤醒 * 2. AB被唤醒时,在synchronized (lock) {lock.wait()} 在wait后的syn{}内代码端依然是单条依次执行,如进入wait前的一致 * ...

fywxin的专栏 159

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

线程间通信Object的waitnotify

wait/notify等待通知方式 等待通知机制就是将处于等待状态的线程将由其它线程发出通知后重新获取CPU资源,继续执行之前没有执行完的任务。最典型的例子生产者–消费者模式 生产者想要在队列中添加产品,消费者需要从队列中取出产品,如果队列为空,消费者应该等待生产者添加产品后才进行消费,队列为满时,生产者需要等待消费者消费一部分产品后才能继续生产。队列可以认为是java模型里的临界资源,生产者和消费者认为是不同的线程,它们需要交替的占用临界资源来进行各自方法的执行,所以就需要线程间通信。 等待/通知机制主

我的博客 345

使用Condition重写waitnotify生产者消费者模型案例

//天猫商品 package com.roocon.thread.ta7; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Tmall2 { pr...

cckkpp的博客 294

二十一、使用Condition重写waitnotify生产者消费者模型案例

//生产者 public class PushTarget implements Runnable{ private Tmail tmail;//销售平台 public PushTarget(Tmail tmail) { this.tmail = tmail; } @Override public void run() { while(true) {//无限循环 tmail...

白夜行悟空 355

JUC进阶成神系列04—线程安全之 wait notify

obj.wait()让进入 object 监视器的线程到 waitSet 等待。**wait()**方法会释放对象的锁,进入 WaitSet 等待区,从而让其他线程就机会获取对象的锁。

m0_45322619的博客 467

wait notify正确使用方式

假设:当线程(Thread03)在1-100中找出77并输出后,(Thread01)输出所有1-100中的奇数,当线程(Thread03)在1-100中找出88并输出后,(Thread02)输出所有1-100中的偶数。

baiqi123456的博客 550

多线程同步和异步的方式

同步:共享资源被多个线程 调用,同步的方式有多种:(场景:卖火车票) 1 syncnizerd 关键字 2 reentrantLock 排它锁 ...

weixin_30439031的博客 190

多线程:并发/并行、死锁

进程是程序的基本执行实体,软件运行后就是一个进程。

qq_73618846的博客 550

2014.8.23

技术:   多线程:     sleep    不释放锁       wait notify  释放锁     suspend resume     yield     http://blog.youkuaiyun.com/sforiz/article/details/4152757   UTF-8 的 BOM 转载于:https://www.cnblogs.com/glasscat/p/...

weixin_30396699的博客 78

java多线程设计模式

java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程。 Thread类是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实...

mmdev 93

java多线程 wait和notify

1. 创建自定义WaitNotify类,实现Runnable接口 public class WaitNotify implements Runnable { private boolean flag; private Object object; public WaitNotify(boolean flag, Object object) { this.flag = flag; this.object = object; }

mister_you的博客 567
上一篇: 多线程教程(十) waitnotify原理
下一篇: 多线程教程(十二)同步模式之保护性暂停
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值