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

Object类中wait带参方法和notifyAll方法

查看Object类的API文档可以看到,除了无参方法wait之外,类中还有重载的有参wait方法:

以及一个 notifyAll方法:

 进入到Timed_Waiting(计时等待)状态有两种方式:

1.sleep(long m)方法,在毫秒值结束之后,线程睡醒,进入到Runnable或BLocked状态。

2.使用wait(long m)方法,wait方法如果在毫秒结束之后,还没有被notify,就会自动醒来,进入到Runnable或BLocked状态。(区别:直接wait无参,是进入waiting无限等待状态,有参是进入Timed_Waiting限时等待状态中)

public static void main(String[] args) {
    // 创建锁对象,保证唯一
    Object obj = new Object();

    // 创建一个顾客线程
    // 使用匿名内部类,这样就不用写继承父类的子类,或实现接口的实现类
    new Thread(new Runnable() {
        @Override
        public void run() {
            // 保证等待和唤醒只能有一个在执行
            // 所以需要使用同步代码块
            while (true) { // 死循环
                synchronized (obj) {
                    // 告知老板需要的包子种类和数量
                    System.out.println("告知老板需要的包子种类和数量");
                    // 调用监视器锁的wait方法,进入waiting状态
                    try { // 捕捉异常
                        // 5000毫秒之后,无notify唤醒,自动醒
                        obj.wait(5000L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    // 唤醒之后的操作
                    System.out.println("包子做好了,开吃!");
                    System.out.println("------------");
                }
            }
        }
    }).start(); // 执行
}

唤醒方法,也一共有两个方法:

1.notify方法唤醒在此对象监视器上等待的单个线程。

2.notifyAll方法唤醒在此对象监视器上等待的所有线程。

public static void main(String[] args) {
    // 创建锁对象,保证唯一
    Object obj = new Object();

    // 创建一个顾客线程
    // 使用匿名内部类,这样就不用写继承父类的子类,或实现接口的实现类
    new Thread(new Runnable() {
        @Override
        public void run() {
            // 保证等待和唤醒只能有一个在执行
            // 所以需要使用同步代码块
            while (true) { // 死循环
                synchronized (obj) {
                    // 告知老板需要的包子种类和数量
                    System.out.println("顾客1告知老板需要的包子种类和数量");
                    // 调用监视器锁的wait方法,进入waiting状态
                    try { // 捕捉异常
                        // 5000毫秒之后,无notify唤醒,自动醒
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    // 唤醒之后的操作
                    System.out.println("包子做好了,顾客1开吃!");
                    System.out.println("------------");
                }
            }
        }
    }).start(); // 执行

    // 创建第二个顾客线程
    new Thread(new Runnable() {
        @Override
        public void run() {
            // 保证等待和唤醒只能有一个在执行
            // 所以需要使用同步代码块
            while (true) { // 死循环
                synchronized (obj) {
                    // 告知老板需要的包子种类和数量
                    System.out.println("顾客2告知老板需要的包子种类和数量");
                    // 调用监视器锁的wait方法,进入waiting状态
                    try { // 捕捉异常
                        // 5000毫秒之后,无notify唤醒,自动醒
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    // 唤醒之后的操作
                    System.out.println("包子做好了,顾客2开吃!");
                    System.out.println("------------");
                }
            }
        }
    }).start(); // 执行

    // 创建一个老板线程(生产者)
    new Thread(new Runnable() {
        @Override
        public void run() {
            // 同步代码块
            while (true) {
                // 唤醒顾客,吃包子
                try {
                    // 花5秒做包子
                    Thread.sleep(5000L); // long型
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj) {
                    System.out.println("5秒到了。包子做好了!");
                    obj.notify(); // 如果有多个线程在等待,随机唤醒一个
                    obj.notifyAll(); // 唤醒所有等待线程,方便同步!
                }
            }
        }
    }).start();
}

 

相关文章:

  • File类
  • 递归(斐波那契数列、类加、累乘、打印多级目录)
  • FileFilter过滤器
  • LeetCode两数之和
  • 稀疏数组
  • 队列
  • 单链表LinkedList的增删改查
  • 双向链表和环形链表(单向和双向)约瑟夫环实例
  • IO流概述+字节输出流
  • 字节输入流
  • 字符流(字符输入流和字符输出流)
  • IO异常的处理
  • 栈Stack(数组模拟、单链表模拟)
  • 属性集合Properties
  • 缓冲流
  • JavaScript-如何实现克隆(clone)函数
  • Akka系列(七):Actor持久化之Akka persistence
  • Angular2开发踩坑系列-生产环境编译
  • express如何解决request entity too large问题
  • Intervention/image 图片处理扩展包的安装和使用
  • JavaScript 奇技淫巧
  • JavaScript的使用你知道几种?(上)
  • JavaScript异步流程控制的前世今生
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Spark RDD学习: aggregate函数
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Vue2.x学习三:事件处理生命周期钩子
  • 闭包--闭包之tab栏切换(四)
  • 番外篇1:在Windows环境下安装JDK
  • 飞驰在Mesos的涡轮引擎上
  • 你真的知道 == 和 equals 的区别吗?
  • 如何选择开源的机器学习框架?
  • 算法---两个栈实现一个队列
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 【云吞铺子】性能抖动剖析(二)
  • Prometheus VS InfluxDB
  • 阿里云ACE认证之理解CDN技术
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​如何防止网络攻击?
  • ​业务双活的数据切换思路设计(下)
  • #{}和${}的区别?
  • (1) caustics\
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (七)Java对象在Hibernate持久化层的状态
  • (一一四)第九章编程练习
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .equals()到底是什么意思?
  • .mysql secret在哪_MYSQL基本操作(上)
  • .mysql secret在哪_MySQL如何使用索引