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

【JavaEE初阶】简单了解wait和notify方法~

目录

🌟1、wait()

🌟2、notify()


🌟1、wait()

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

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

        (3)wait(long) 是让线程等待一段时间,过时不候——>TIMED_WAITING:有时间限制的等待。

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

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

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

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


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


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

        (1)wait与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/17242.html

相关文章:

  • MySQL 精选 35 道面试题大厂稳了(含答案)
  • 真无线耳机哪款性价比高?高性价比无线耳机排行榜
  • Apache POI,springboot中导出excel报表
  • Websocket的基本认识、使用与封装
  • JavaScript:数组---二分法
  • 【笔试强训选择题】Day7.习题(错题)解析
  • 看我如何通过帮助服务台轻松黑掉数百家公司
  • selenium自动化面试题回答
  • KeepAlived高可用环境搭建
  • JavaScript:二叉树(层序遍历)
  • Python | 人脸识别系统 — 人脸识别
  • Linux线程:互斥锁mutex的使用
  • 什么是Spring FactoryBean?有什么作用?
  • ES6:promise简单学习
  • 从MultipartFile上传文件名乱码开始详解编解码知识
  • 2023年会展服务研究报告
  • DDD系列:二、应用架构设计演变
  • 初识WebAssembly
  • 京东T7架构师用470页就把微服务架构原理与开发实战文档讲完了
  • 【华为OD机试 2023最新 】递增字符串(C语言题解 100%)
  • 第二章--第一节--什么是语言生成
  • 【51单片机】数码管显示(样例展示以及异常分析)
  • Camtasia2023最好用的电脑屏幕录制软件
  • 11 | Qt的日志
  • 【UE】高级载具插件-04-坦克瞄准开火
  • mysql索引和事务
  • 很佩服的一个Google大佬,离职了。。
  • 1. 先从云计算讲起
  • NEWS|关于人工智能大型语言模型能否理解的争论
  • Allegro自定义快捷键(修改 ix iy 的步进,其他快捷功能)