一.等待和通知

wait和notify也是为了处理线程调度随机性的问题的,但是这个随机性不太好,还是需要让彼此之间有一个固定的顺序的,join也是一种控制顺序的方式,更倾向于控制线程结束,也是有局限性的,wait和notify更好一些,调用wait方法的线程,就会陷入阻塞,一直阻塞到有其他线程通过notify来通知

public class Demo18 {public static void main(String[] args) {Object o = new Object();System.out.println("wait 前");try {o.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("wait 后");}
}

调用wait后就陷入阻塞了,wait内部会做三件事:先释放锁,然后等待其他线程的通知,后面收到通知后,重新获得锁,并继续执行下去.因此要使用wait/notify,就得搭配synchronized,wait哪个对象就得给哪个对象加锁

public class Demo18 {public static void main(String[] args) {Object o = new Object();synchronized (o){System.out.println("wait 前");try {o.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("wait 后");}}
}

此时这个线程的状态就是WAITING了陷入阻塞状态了,再搭配一下notify

public class Demo19 {private static Object o = new Object();public static void main(String[] args) {Thread t1 = new Thread(()->{//wait()synchronized (o){System.out.println("wait 前");try {o.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("wait 后");}});t1.start();Thread t2 = new Thread(()->{//notify()synchronized (o){System.out.println("notify 前");o.notify();System.out.println("notify 后");}});t2.start();}
}

首先先会进行wait,然后等待直到notify后才会继续执行下去

还有一个notifyAll方法,例如有一个对象里面有10个线程,都调用了o.wait,此时10个线程都是阻塞状态,调用o.notify,就会把这10个线程其中一个唤醒(具体时间安一个并不清楚),而notifyAll方法就会把10个线程全部唤醒,wait唤醒之后,会重新尝试获得锁(10个线程就会进入竞争,没竞争到的话还是继续等待,然后再竞争),相对来说,更常用的还是notify方法!

线程wait和notify方法相关推荐

  1. 线程wait和notify深入学习和分析

    我们都知道简单的生产者和消费者的实现就是通过Object内的wait和notify实现的.至于例子暂时不写了. 一.前言 常见面试题: 为什么wait和notify方法是Object类中的方法,而不是 ...

  2. java线程学习之notify方法和notifyAll方法

    notify(通知)方法,会将等待队列中的一个线程取出.比如obj.notify();那么obj的等待队列中就会有一个线程选中并且唤醒,然后被唤醒的队列就会退出等待队列.活跃线程调用等待队列中的线程时 ...

  3. Java线程的挂起与恢复 wait(), notify()方法介绍

    一, 什么是线程的挂起与恢复 从字面理解也很简单. 所谓线程挂起就是指暂停线程的执行(阻塞状态). 而恢复时就是让暂停的线程得以继续执行.(返回就绪状态) 二, 为何需要挂起和恢复线程. 我们来看1个 ...

  4. 多线程笔记补充之线程通信wait和notify方法以及Lock和Condition接口的使用

    线程通信-wait和notify方法介绍: java.lang.Object类提供类两类用于操作线程通信的方法. wait():执行该方法的线程对象释放同步锁,JVM把该线程存放到等待池中,等待其他的 ...

  5. java线程方法notify,JAVA-线程wait方法与notify方法详解

    一.notify的含义(视为使当前线程获取对象锁并于规定一定条件下释放的方法) (1)notify一次只随机通知一个线程进行唤醒(notifyAll则为全部) (2)  在执行了notify方法之后, ...

  6. 线程和进程/阻塞和挂起以及那些sleep,wait()和notify()方法详解

    线程与进程的阻塞 线程阻塞 线程在运行的过程中因为某些原因而发生阻塞,阻塞状态的线程的特点是:该线程放弃CPU的使用,暂停运行,只有等到导致阻塞的原因消除之后才回复运行,或者是被其他的线程中断,该线程 ...

  7. 线程通讯(wait方法、notify方法、notifyAll方法)

    目录 1. 方法介绍 2. wait使用 3. notify使用 4. notifyAll使用 5. 注意事项 由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知. 但是实际开发中有时候 ...

  8. java并发锁获取的方式_Java精通并发-notify方法详解及线程获取锁的方式分析

    wait(): 在上一次https://www.cnblogs.com/webor2006/p/11404521.html中对于无参数的wait()方法的javadoc进行了解读,而它是调用了一个参数 ...

  9. 对象的notify方法的含义和对象锁释放的三种情况

    1,notify的含义     (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...

最新文章

  1. sliva数据库简介--转载
  2. 受益一生的15个学习习惯
  3. 近期活动盘点:大数据应用中日交流论坛、几位专家带你认识Flink、青年自强AI计划 CV免费公开课!(11.12-11.23)...
  4. 干货丨计算机视觉必读:图像分类、定位、检测,语义分割和实例分割方法梳理(经典长文,值得收藏)
  5. [转] android自动化之MonkeyRunner测试环境配置(一)
  6. itext 添加空格_借助 iText 用代码在 PDF 中创建空白签名域
  7. MySQL中的索引(唯一索引篇)
  8. mysql建立索引 有什么缺陷_MySQL数据库建立索引的优缺点以及什么样的字段适合建立索引...
  9. 3.1 Ext JS 组件总览
  10. 宇宙是什么,有尽头吗,为什么?
  11. Linux下MySQL起动报错The server quit without updating PID file
  12. js实现本地上传图片及预览
  13. 在树莓派上创建区块链节点
  14. CCNA上机实验_19-PPP
  15. 国企招聘:中国空空导弹2023校园招聘正式启动
  16. KRKR基础篇(二)
  17. 数学 立方和公式 立方差公式
  18. matlab 沃尔什矩阵,压缩感知——沃尔什-哈达玛(WHT)变换与逆变换的Matlab代码实现...
  19. word里面如何插入柱形图
  20. easyui Datagrid+searchbox 实现搜索功能

热门文章

  1. 基于SSM的图书馆座位预约管理系统
  2. C++实现简易图书馆管理系统
  3. CSS如何设置html table表格边框样式
  4. yolov5 检测detect.py笔记
  5. 不用做实验也可以轻松找到癌症组织特异性基因
  6. @Transactional注解说明
  7. 函数的重载与重载解析
  8. 矩阵变换:矩阵是怎样变换向量的
  9. 1分钟链圈 | 区块链人才稀缺,深圳企业提高8%薪酬预算抢才!美投行:加密货币将暴跌90%,大众市场或被消灭...
  10. 能聊天、会学习,远不是GPT的终局