概述

多线程之间想要互相通信来协作的话,比如A线程在做完一些事情后需要等待B线程一个通知才能继续。这个时候就需要wait()notify()方法了。

顾名思义,wait就是等待,notify就是唤醒,notifyAll则是唤醒所有,interrupt是中断wait状态的线程。

在当前线程中调用对象的wait方法会使得当前线程进入等待。直到该对象的notify方法被调用。来个demo说明一下。

注意点:在调用wait()notify()之前,线程必须获得该对象的锁,因此只能在同步方法/同步代码块中调用wait()notify()方法。

Object lock = new Object();new Thread(() -> {try {System.out.println("开始wait" + LocalDateTime.now());synchronized (lock){lock.wait();}} catch (InterruptedException e) {e.printStackTrace();}}).start();new Thread(() -> {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("3秒后唤醒" + LocalDateTime.now());synchronized (lock){lock.notify();}}).start();

notifyAll()

经过上面的demo叙述可以知道,其实wait()方法就是让该线程的方法释放共享资源的锁,然后自己进入等待队列中,直到被再次唤醒。

notify()方法则是随机唤醒等待队列中等待同一共享资源的一个线程,并使得该线程退出等待状态,进入可运行状态。

那么notifyAll()方法就是让所有正在等待队列中等待同一共享资源的全部线程从等待状态退出,进入可运行状态。

如果wait()方法和notify()/notifyAll()方法不在同步方法/同步代码块中被调用,那么虚拟机会抛出java.lang.IllegalMonitorStateException

Object的wait()和notify()以及notifyAll()和interrupt()方法相关推荐

  1. Object的wait、notify和notifyAll方法

    方法简介 wait方法 当一个线程调用一个共享变量的wait()方法时,该调用线程会被阻塞挂起(进入waiting状态),直到发生下面几件事情之一才能返回: 其他线程调用了该共享对象的notify() ...

  2. 【Java 线程的深入研究3】最简单实例说明wait、notify、notifyAll的使用方法

    wait().notify().notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态. 这三个方法最终调用的都是jvm级的native方法.随着jvm运行平台的不同可能有些 ...

  3. 最简实例说明wait、notify、notifyAll的使用方法

    /** *  转载请注明作者longdick    http://longdick.iteye.com * */ wait().notify().notifyAll()是三个定义在Object类里的方 ...

  4. 通过两个小栗子来说说Java的sleep、wait、notify、notifyAll的用法

    线程是计算程序运行的最小载体,由于单个单核CPU的硬件水平发展到了一定的瓶颈期,因此就出现了多核多CPU的情况,直接就导致程序员多线程编程的复杂.由此可见线程对于高性能开发的重要性. 那么线程在计算机 ...

  5. 第五章 Java 中的 wait、notify 和 notifyAll 方法示例

    您可能已经注意到 Object 类具有三个 final 方法,分别称为 wait.notify 和 notifyAll.这些方法用于线程间通信.Java 5 引入了执行器框架,它为您处理线程间通信,并 ...

  6. wait,notify,notifyAll作用、方法

    1.阻塞阶段 线程调用wait()方法进入阻塞阶段,前提是获得monitor锁才可以(object的wait(),notify(),notifyAll()都需要先获得锁,不然会抛出异常). 2.直到以 ...

  7. 为什么wait、notify、notifyAll方法定义在Object中而不是Thread类中

    多线程概述 Java是一个支持多线程的开发语言,多线程并发执行任务可以充分利用CPU资源,提高多任务并发执行效率(注意区分:多线程并不会加快任务的执行速度,而是可以充分利用多核CPU让线程轮流进行工作 ...

  8. Object类九大方法之notify和notifyAll方法

    Object类九大方法之notify和notifyAll方法 notify()方法表示,当前的线程已经放弃对资源的占有, 通知等待的线程来获得对资源的占有权,但是只有一个线程能够从wait状态中恢复, ...

  9. java监视器_java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)...

    在Java中,与线程通信相关的几个方法,是定义在Object中的,大家都知道Object是Java中所有类的超类 在Java中,所有的类都是Object,借助于一个统一的形式Object,显然在有些处 ...

最新文章

  1. 施一公:年轻人不要花时间去拉关系,尽全力做研究,以实力取胜!
  2. 计算机学院杨洋,美国莱特州立大学吴志强教授访问计算机科学与技术学院
  3. 日志分析工具 LogParser
  4. LeetCode:937. Reorder Log Files
  5. (chap6 Http首部) 响应首部字段 Accept-RangeAge Etag
  6. 计算机应用基础任务化教程知识点,计算机应用基础任务化教程
  7. ECharts - 地图
  8. additemdecoration重复_安卓中另一个强大的大量数量集控件RecyclerView
  9. JAVA→JDBCJava DataBase Connectivity、存储过程Stored Procedure、事务Transaction、连接池DBCP C3P0、JDBC升级替代框架
  10. HTML 引用小图标
  11. jenkins调用shell脚本实现自动上线完整项目---此项目中用到了git parameter、choise parameter参数化构建(五)
  12. CUDA——线程束分化
  13. Light Emitting Hindenburg 解题思路
  14. 《Deep Learning for Computer Vision withPython》阅读笔记-StarterBundle(第6 - 7章)
  15. 关于绝地求生某辅助白名单画中画逆向分析
  16. 输出由1、2、3、4四个数字组成的每位都不相同的所有三位数
  17. pytz 的所有函数
  18. dac0832控制电机驱动流程图_应用DAC0832单片机控制小直流电机转速的设计.doc
  19. 边缘计算和雾计算什么关系_什么是雾计算?
  20. [教程]Ubuntu20.04安装Node.js

热门文章

  1. USGS今天开始向全球提供Landsat9下载
  2. Android串口通讯,在线程里一直监听是否有消息发来,接收到消息到runOnUiThread处理跳转页面,页面跳转关闭之后,在发送消息尽然还会执行在打开页面?
  3. 2022年四川省安管人员报名即将结束!C证报名11月9日截止!
  4. “应试教育的死穴,恰在于堵住了孩子“犯错”空间”——有感
  5. 同步等待 异步等待_异步/等待与承诺互操作性
  6. 尚硅谷在线教育十四:微信支付
  7. c++狼人杀12人标准场有发言有选警附exe文件
  8. c语言设计模式--状态模式(状态机)
  9. ltspice语言中文_LTspice下载|LTspice(电路仿真软件)下载v4.14r 中文免费版 附安装教程 - 欧普软件下载...
  10. 网页设计与网站规划 作业10 NBA总决赛统计表