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

【多线程初阶三】简单了解wait和notify方法~

目录

🌟1、wait()

🌟2、notify()


🌟1、wait()

        (1)wait()方法与notify()方法都是Object类中的方法。

        (2)wait()是让线程等待一段时间,死等——>状态WAITING:没有时间限制的等待.

        (3)wait(long) 是让线程等待一段时间,过时不候。在一定时间内不会被调度到CPU中——>TIMED_WAITING:有时间限制的等待。

        wait()必须与关键字synchronized联合使用,否则会报错。

❓ 问题1:区分wait()与join()

        (1)wait()是Obejct类中的方法,join()是Thread类中的方法;

        (2) join()是让调用方去等待,wait()是让执行方去等待。


        🌰导师告诉班长,现在要去辅导员办公室取一份资料回来签字。班长过去了🧑,发现学院里所有的班长都来了,资料不过,现在还在打印中,让大家全部都等待一会。😫这个班长等待的过程其实就是执行方等待。等到所有的资料都打印完毕,辅导员这时候喊一声:所有的班长都过来,这就是notifyAll(),唤醒了所有的线程;如果是只喊了一个:一班的班长来一下,那就是notify(),只唤醒了一个线程,其他的线程还在等待。等到班长终于拿好资料回去找导师的时候,导师在这期间等待的过程就是一个调用方等待。你理解了吗~😆


❓ 问题2:区分wait()与sleep()

        (1)wait与sleep是完全没有可比性的🤣一个是用于线程之间的通信,另一个是让线程阻塞等待的。不过都是可以让线程放弃执行一段时间;sleep可以写在程序的任何位置。

        (2) wait()是Object类中的方法,sleep()是Thread类中定义的方法;

        (3) wait()必须要和synchronized关键字搭配使用,调用之后会释放锁;sleep()只是让线程进入休眠状态,和锁毫无关系。

🌟2、notify()

        notify(): 只唤醒等待中的一个线程,并直接参与锁竞争;

        notifyAll:() : 一次性唤醒等待中的所有线程,线程共同去参与锁竞争。

🌰  wait与notify必须是同一个锁对象,wait必须与synchronized搭配使用。 wait与notify被调用后,当前线程都会释放锁资源。


    private static Object locker = new Object();

    public static void main(String[] args) {
        Thread t1 = new Thread(()->{
            while (true){
                System.out.println("t1在等待之前");
                try {
                    synchronized (locker) {
                        locker.wait();
                    }

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("t1在等待之后");
                System.out.println("=============================");
            }
        });
        t1.start();
        Thread t2 = new Thread(()->{
            while (true){
                System.out.println("t2唤醒之前");
                //唤醒时也要使用同一个锁对象
                synchronized (locker) {
                    locker.notify();
                }
                System.out.println("t2唤醒之后");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t2.start();
    }

控制台输出: 


        中午继续努力~ 


http://www.kler.cn/news/18553.html

相关文章:

  • [Go语言实战]并发模式runner
  • iOS输入限制表情输入、最大字符、正则过滤
  • Geoffrey Hinton对于AI的警示 20230507
  • SQL 招聘网站岗位数据分析
  • 数据挖掘笔记
  • Spring-AOP
  • 文心一言 VS chatgpt (6)-- 算法导论2.3 1~2题
  • macOS的CAOpenGLLayer中如何启用OpenGL3.2 core profile
  • Oracle监控账号创建【Prometheus】
  • webstorm 创建harthat项目
  • AI 工具合辑盘点(七)持续更新 之 AI 音乐制作工具
  • 【运动规划算法项目实战】如何利用AABB作碰撞检测(附ROS C++代码)
  • SQL学习日记
  • 从文字到语义:文本分词和词性标注的原理与实现
  • Gradio的web界面演示与交互机器学习模型,安装和使用《1》
  • 拐点已至!被比亚迪赶超,大众中国打响「翻身战」
  • 单元测试 - 集成H2 Dao测测试
  • 【Redis7】Redis7 持久化(重点:RDB与AOF重写机制)
  • 名称空间(namespaces)与作用域
  • [LeetCode周赛复盘] 第 344 场周赛20230507
  • 从不同视角来看待API数据接口
  • Unity用脚本获取物体和组件(下)
  • MySQL基础(三)基本的SELECT语句
  • eSIM证书要求-证书验证-EID
  • 第1章 Nginx简介
  • 187页9万字企业大数据治理与云平台实施方案(word)
  • sentinel 随笔 0-责任链
  • 俩小伙一晚上写了个 AI 应用,月入两万??(文末附开发教程)
  • Scrum敏捷开发工具-单团队敏捷开发管理
  • Linux用户空间与内核空间通信(Netlink通信机制)