当前位置: 首页 > news >正文

谈谈 wait 和 notify

目录

1 wait()方法

2 notify()⽅法 

3 wait 和 sleep 的区别


多线程调度是随机的, 很多时候希望多个线程能够按照咱们规定的顺序来执行. 完成线程之间的配合工作. wait和notify就是一个用来协调线程顺序的重要工具. 这俩方法都是 Object 提供的方法.
随便找个对象,都可以使用wait和notify.

1 wait()方法

上述代码会抛下面的异常. 

 

 

wait要解锁, 前提就是先能加上锁. 锁都没加, 谈何解锁呢?

那这样思路就明朗了, 先加锁, 在synchronized里头再进行wait!!

public class Demo14 {
    public static void main(String[] args) throws InterruptedException {
        Object object = new Object();
        synchronized (object) {
            object.wait();
        }
        System.out.println("wait 结束");
    }
}

通过jconsole可以看到main线程就进入堵塞状态了.

 

 

2 notify()⽅法 

notify ⽅法是唤醒等待的线程.

如果有N个线程等待,则有线程调度器随机挑选出⼀个呈 wait 状态的线程。(并没有 "先来后到")

在notify()⽅法后,当前线程不会⻢上释放该对象锁,要等到执⾏notify()⽅法的线程将程序执⾏ 完,也就是退出同步代码块之后才会释放对象锁.

notifyAll 唤醒全部处于waiting 中的线程, 但是用起来不是特别好.

public class Demo15 {
    // 使用这个锁对象来负责加锁, wait, notify

    private static Object locker = new Object();

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            while (true) {
                synchronized (locker) {
                    System.out.println("t1 wait 开始");
                    try {
                        locker.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("t1 wait 结束");
                }
            }
        });
        t1.start();

        Thread t2 = new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (locker) {
                    System.out.println("t2 notify 开始");
                    locker.notify();
                    System.out.println("t2 notify 结束");
                }
            }
        });
        t2.start();
    }
}

 

 

3 wait 和 sleep 的区别



 

相关文章:

  • Web项目测试专题(七)安全性测试
  • AI前端开发赋能自主创业:ScriptEcho助你乘风破浪
  • 前端布局的方式有哪些
  • Qt 中使用 ffmpeg 获取采集卡数据录制视频
  • K8s 证书认知(K8s Certificate Awareness)
  • 洛谷P8707 [蓝桥杯 2020 省 AB1] 走方格
  • HBuilderX中uni-app打开页面时,如何用URL传递参数,Query参数传递
  • Java 与设计模式(15):模板方法模式
  • 前端如何实现一个五星评价,鼠标滑动,前边星星颜色的变黄,后边的不变;
  • java后端开发day16--字符串(二)
  • 25/2/17 <嵌入式笔记> 桌宠代码解析
  • VisionMaster4.4 python脚本 图像处理 转换函数 爱之初体验
  • recent移除task时,结束其所有进程和service(全Android版本)
  • 日常开发中,使用JSON.stringify来实现深拷贝的坑
  • PHP支付宝--转账到支付宝账户
  • 计算机专业知识【探秘 C/S 工作模式:原理、应用与网络协议案例】
  • NBT群落物种级丰度鉴定新方法sylph
  • 【C语言】有序数组的平方
  • 《DeepSeek 一站式工作生活 AI 助手》
  • 外包干了3年,技术退步太明显了。。。。。
  • 第五轮伊美核问题谈判将于5月23日在罗马举行
  • 秦洪看盘|风格有所转向,赚钱效应减弱
  • 为俄乌一日三通电话,这里成“关键战场”?
  • 2025年新季夏粮收购量将达到2000亿斤左右
  • 甘肃省白银市一煤矿发生透水事故,3人失联
  • 中国旅游日|上天当个“显眼包”!低空经济的“飞”凡魅力