wait()和notify()

wait()/notify()/notifyAll() 的用法 多线程笔记(十):wait()方法: 该方法用来使得当前线程进入等待状态,直到接到通知或者被中断打断为止。 在调用 wait() 方法之前,线程必须要获得该对象的对象级锁;换句话说就是该方法只能在同步方法或者同步块中调用,如果没有持有合适的锁的话,线程将会抛出异常 IllegalArgumentException。调用 wait() 方法之后,当前线程则释放锁。 notify()方... 阅读详情

wait()和notify()

从https://www.cnblogs.com/toov5/p/9837373.html 可以看到他的打印是一片一片的,这边博客介绍怎么避免掉

使用notify 和 wait的时候 要注意 是在synchronize进行的,持有同一把锁

1.因为涉及到对象锁,他们必须都放在synchronized中来使用. Wait、Notify一定要在synchronized里面进行使用。

2.Wait必须暂定当前正在执行的线程,并释放资源锁,让其他线程可以有机会运行

3. notify/notifyall: 唤醒因锁池中的线程,使之运行

注意:一定要在线程同步中使用,并且是同一个锁的资源

 

一片的原因是: cpu在调度时候 读一直被调度上了

package com.toov5.thread;

//共享对象
class Res{
    public boolean flag = true;
    public String sex;
    public String name;
    
}

class inputThread extends Thread{
     public Res res;
     public inputThread(Res res) {
        this.res=res;
    }
    @Override
    public  void run() {
      int count=0; 
      while (true) {
          synchronized (res) {
               if (res.flag) {
              try {
                res.wait();   //此处一定要用res的wait!!!! 执行到这里就会阻塞了 下面的代码不会执行了  释放当前锁对象
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            }
                if (count==0) {
                    res.name="lucy";
                    res.sex="girl";    
                }else {
                    res.name="Jack";
                    res.sex="boy";
                }
                count =(count+1)%2;
                res.flag=true;  //写完了 标记当前线程为等待 然后走wait()了
                res.notify();  //通知读的线程
        }
    }
    }
}

class readThread extends Thread{
    public Res res;
    public readThread(Res res) {
        this.res=res;
    }
    
    @Override
    public void run() {
        while (true) {    
        synchronized (res) {
               if(!res.flag){
                 try {
                    res.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }    
               }
               System.out.println(res.name+","+res.sex);
               //读完了时候要 
               res.flag=false;
               res.notify();//通知写的线程
               
            }
        }        
    }
}

public class ConmunicatThreadTest {
    //开启两个线程  下面的线程 主线程 还有这俩用户线程 cpu随机的

    public static void main(String[] args) {
        Res res = new Res();
    inputThread inputThread = new inputThread(res);
    readThread  readThread = new readThread(res);
    inputThread.start();
    readThread.start();
    
    }  
       
    
}

看下结果:

 

 

分析下: 

两个线程 并行在执行 假设 flag为false  读的线程会等待  cpu执行权让给写的线程同时锁也会释放掉  

                                         写的时候 读的线程发现为true (while(true)的情况) 等待notify() 被唤醒,被唤醒后 从wait处继续往下执行  唤醒被等待的线程~~~

 notifyall 是唤醒所有的  小伙伴们可以自己试试哈

 注意  notify 和 wait 一定要在synchronize里面使用!!!!!并且同一个锁对象的!  

 

wait与join 区别:

 wait需要唤醒  wait需要用在同步里面

 

wait与sleep区别

对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。

在调用sleep()方法的过程中,线程不会释放对象锁。

而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备

获取对象锁进入运行状态。

  sleep不去释放锁 wait释放

 

wait notify 为啥设计在object类 因为任意对象作为锁嘛 Object是任何类的祖宗~ 所以小伙伴们都明了了吧~~

 

【机器学习】实验3,贝叶斯垃圾邮件识别(完整代码实现+报告) 电子邮件是互联网的一项重要服务,在大家的学习、工作和生活中会广泛使用。但是大家的邮箱常常被各种各样的垃圾邮件填充了。有统计显示,每天互联网上产生的垃圾邮件有几百亿近千亿的量级。因此,对电子邮件服务提供商来说,垃圾邮件过滤是一项重要功能。而朴素贝叶斯算法在垃圾邮件识别任务上一直表现非常好,至今仍然有很多系统在使用朴素贝叶斯算法作为基本的垃圾邮件识别算法。本次实验数据集来自的中文垃圾邮件数据集,目录解压后包含三个文件夹,其中data目录下是所有的邮件(未分词),已分词好的邮件在data_cut目录下。 阅读详情

相关推荐

Android真机调试——ADB调试(含华为手机无法找到设备)

本文以Huawei Nova7为例。

lianqi2003的博客 7860

【多线程】wait()和notify()

本期内容主要讲解如何协调多个线程之间的执行顺序,使用wait()方法和notify()方法解决,详细介绍这两个方法,并同时介绍常见面试题,wait()与join()、sleep()方法之间的区别。

爱编程爱运动的博客 5129

【小白指南】如何将deepseek引入WPS\Word\Excel中去?

如何将deepseek引入WPS\Word\Excel中去?纯小白都能看的懂,一步步操作就能行

2503_90498422的博客 1万+

Java线程基础(13):wait()和notify()

简介 本文讲解Java中wait()、notify(),通过一个标准的使用实例,来讨论下这两个方法的作用和使用时注意点,这两个方法被提取到顶级父类Object对象中,地位等同于toString()方法。 一、wait()和notify()含义 wait()方法是让当前线程等待的,即让线程释放了对共享对象的锁,不再继续向下执行。 wait(long timeout)方法可以指定一个超时时间,过了这个时间如果没有被notify()唤醒,则函数还是会返回。如果传递一个负数timeout会抛出I...

mingyuli的博客 1万+

SAP FICO 银企直联实战:从配置到异常处理的全流程解析

本文详细解析了SAP FICO银企直联的实战配置与异常处理全流程,涵盖银行主数据搭建、支付类配置、银行接口适配等关键步骤。通过实际案例分享,帮助用户掌握实时付款、余额监控和自动对账等核心功能,提升企业财务效率与安全性。特别针对常见问题如凭证重复付款、前置机UUID冲突等提供了实用解决方案。

weixin_29215815的博客 663

超详细MySQL 8.0安装与配置

MySQL的安装与配置 还不会安装MySQL的同学们,还不会配置MySQL的同学们,赶紧按照下面步骤操作起来,超详细安装步骤如下: 进入MySQL官网 1、点击download 2、点击MySQL Community Server 3、选好选项点击go to download page 4、点击download 5、点击no thanks,just start my download 6、选Server only,点击Next 7、点击Execute 8、点击

Turniper的博客 8756

Java多线程wait()和notify()方法图解

多线程场景下 wait 和notify 方法详解,注意事项,内部阻塞队列和等待队列的过程,wait和sleep方法的区别

VIBE的博客 4249

copilot基于 DeepSeek-R1 思路构建 VLA 自动驾驶强化学习系统

下面给出一个完整示例代码,结合 DeepSeek‑R1 的技术方法,实现一个端到端的 VLA(视觉+语言行动)自动驾驶深度强化学习系统。.2f。

ywfwyht的博客 774

wait方法 与 notify方法

1. 线程状态图 这是线程的7状态模型图,常见的7大状态之间的转换关系也在上面。多线程之间的通信主要用到4个方法,wait()、wait(long time)、notify()、notifyAll(),其他方法在多线程基础中都有介绍。 wait():作用是使当前线程从调用处中断并且释放锁转入等待队列,直到收到notify或者notifyAll的通知才能从等待队列转入锁池队列,没有收到停止会一直死等。 wait(long time):相比wait多了一个等待的时间time,如果经过time(毫秒)时

weixin_43808717的博客 1万+

Python 爬虫实战:亚马逊 + eBay 商品信息跨平台抓取(价格 / 销量 / 评价对比)

亚马逊和 eBay 是全球知名的电商平台,拥有海量的商品信息。对于消费者来说,比较不同平台上的商品价格、销量和用户评价可以帮助他们找到性价比最高的商品。对于商家而言,了解竞争对手的商品信息有助于优化自身的产品策略和定价策略。然而,手动在两个平台上逐一比较商品信息是非常耗时且低效的。因此,开发一个能够自动抓取并对比这两个平台商品信息的爬虫工具具有重要的实际意义。

yansideyucsdn的博客 617

YOLOv11改进,YOLOv11结合DynamicConv(动态卷积),CVPR2024,二次创新C3k2结构

DynamicConv(动态卷积)是一个用于提高卷积神经网络(CNN)性能的技术,核心思想是动态地生成卷积核(filter),而不是使用固定的卷积核。通过引入更多的计算灵活性和适应性来增强卷积操作的表达能力,进而提升模型的性能。专家选择:DynamicConv 通过引入多个“专家”(experts),每个专家学习特定的卷积模式。输入图像的不同部分会选择不同的专家进行卷积。动态卷积核生成:根据输入的不同特征,专家网络动态地生成卷积核,而不是使用固定的卷积核。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2263

notify()和wait()

   原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11398563.html   notify() 和 wait() 主要是用来多个线程之间的协作。   它们都是Object的方法,任何对象都可以调用这两个方法。   首先设置一个多个线程共享的对象 : //共享对象 Object shareOb...

agg824244的博客 338

【深度学习新浪潮】AI 智能眼镜关键视觉技术、技术栈及开源项目全解析

Meta新款智能眼镜在演示中暴露出的AI误判和延迟问题,揭示了端侧视觉与多模态算法落地的核心瓶颈。本文从算法工程视角解析了AI智能眼镜的三大关键技术:感知增强(多帧降噪、HDR成像)、场景解析(轻量化目标检测、语义分割)和空间定位(视觉SLAM、ToF辅助),并梳理了完整的技术栈架构,包括硬件适配、驱动优化和框架选型。文章还提供了高价值开源项目参考,如OpenXR和ORB-SLAM3,为端侧视觉算法落地提供实操指南,助力开发者攻克算力约束下的实时性、精度和功耗平衡难题。

专注:太空算力、AI infra、异构调度、大模型成本工程 530

Java多线程基础-7:wait() 和 notify() 用法解析

详解Java多线程编程中,wait()和notify()方法的使用方式和注意事项,配合代码案例~

wyd_333的博客 8414

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【JavaEE初阶 — 多线程】wait() & notify()

wait() & notify()

OuO-1 的博客 1813

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

JAVA-wait()和notify()

大家应该都知道,线程之间是抢占式随机执行的,但是我们并不希望这样。因为这样非常混乱,并不好去预估程序的执行结果。我们甚至希望,线程之间能够配合执行,那么我们就可以使用wait()和notify()来做到。

Lizhihao_的博客 1552

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

wait() 一定需要notify()唤醒吗?

wait() 一定需要notify()唤醒吗?20120810       写这篇文章是源于论坛里的一个帖子,   "线程同步问题,分析下程序运行结果"  其地址为:      http://topic.youkuaiyun.com/u/20120808/17/f1742060-7501-430b-b509-a492eef535f5.html.       当时按照一般的wait(),notify()思想做了

nmyangym的专栏 6870

【多线程初阶】wait() & notify()

wait()与sleep和join的区别 & notify() & notifyAll() & 协调多个线程之间的执行顺序

2503_90322569的博客 928

一个理解wait()与notify()的例子

下面是我原来在优快云论坛上看到的一个贴子,涉及到同步,wait(),notify()等概念的理解,我试着根据原来的一些回复和Think in Java上的相关概念将wait()和notify()这两个方法剖析了一下,欢迎指教.问题如下:file://分析这段程序,并解释一下,着重讲讲synchronized、wait(),notify 谢谢!class ThreadA {  public

xm4014的专栏 1万+

wait()和notify()

wait和notify是Object类提供的一个方法,这代表着所有类型的对象都可以调用这两个方法,但是这两个方法的具体使用场景还是在多线程模式下,为什么呢?

2503_91154453的博客 977

Java wait() notify()方法使用实例讲解

1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。   2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即锁,或者叫管程)   3)调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的monitor,则只能唤醒其中一个线程;

Java 之 道 4万+

Android中对象锁的wait()和notify()

基本概念:对象锁synchronized(object){….}用法 在以上的代码块中只能由一个线程执行!!! wait()、notify()是用在这个代码块当中的。wait()可以使当前线程A马上失去对象锁并且沉睡,直到对象调用notify()唤醒该线程。此时持有对象锁的线程B会先行执行完毕,然后再将对象锁交给线程A继续执行。 例子说明: public class Person { ...

haigand的专栏 3091

wait() 、notify()、notifyAll() 的详细用法

首先,我们知道,线程的执行顺序是随机的(操作系统随机调度的,抢占式执行),但是有时候,我们并不喜欢这种随机的执行,更喜欢的是它们能够顺序的执行,所以,Java就引入了一种机制,wait() 和 notify() ,它们的而前面的文章中也讲过一个方法,也是能影响线程的执行顺序,但是呢,这个join只能控制线程结束的顺序,而我们想要的是,线程不结束,也能按照我们自己规定的顺序去依次执行;

Shine0115的博客 2606

线程安全——wait()和notify的使用

我们可以发现,线程t1里面的东西因为wait()等待而没被执行到,下面t2、t3线程都被执行到了,而有参数的wait可以通过参数的时间等待执行一次。方法来让线程等待,我们可以用同一个Object类来用wai()方法进行等待,也可以用多个Object()类来进行。wait是Object的方法,sleep是Thread的静态方法。方法需要notify来进行唤醒,如果有参数就是需要满足时间条件唤醒(一个参数是毫秒参数,俩个参数第一个参数是。,也就是把线程放到等待队列中。方法暂停执行,等待条件满足再被唤醒。

gug12345sheh的博客 1397

notify()方法、notifyAll()方法和wait()方法

线程作为程序内部的多个执行流,相互之间是可以通讯的。线程间通讯可以通过多种方式来进行,例如:线程间可以共享变量来进行通讯,使每个线程根据共享变量的值进行操作和运算,当通过共享变量进行通讯时,通常需要引入同步控制, 线程间也可以通过 wati()、notify()和notifyAll()等方法进行通讯。 每一个类的对象的实例都有一个等待集合,当在该实例上调用wait()方法后,线程都会进入到该实例的等待集合中。 wait()、notify() 和 notifyAll()方法使类Obje...

Meiko记录 1万+
上一篇: 多线程之间的通讯
下一篇: 关于lock锁
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值