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

wait/notify方法 等待唤醒机制

 线程正在运行,调用这个线程的wait()方法,这个线程就会进入一个集合进行等待(这个集合的线程不会争抢cpu),此时线程的状态就是waiting

当有线程调用notify()方法的时候,就会从集合中挑选一个线程进入到排队队列里面

notifyAll就是将等待集合中的所有线程唤醒,加入到排队队列中去

wait和notify方法都是属于Object类的

public class Test
{public static void main(String[] args) throws InterruptedException{Object object=new Object();new Thread( ()->{synchronized(object){System.out.println(Thread.currentThread().getName()+"开始运行");object.wait();//执行到这行代码的时候,线程卡在这里了,进入了等待集合System.out.println(Thread.currentThread().getName()+"我被唤醒了,我又重新开始运行了");}},"t1").start();new Thread( ()->{Thread.sleep(1000);System.out.println(Thread.currentThread().getName()+"开始运行");synchronized(object){object.notify();}},"t2").start();}
}

所以运行后:

先是线程1运行,然后执行到object.wait()的这一行的时候,线程1卡住了,进入到Object类的对象object的wait等待集合里,同时将object锁也释放掉

然后线程2运行,它先是拿到object锁,然后唤醒了在object对象的wait等待集合中的线程1,然后线程1就进入排队队列中,cpu一空出来就可以运行

这里区分一下:sleep方法和wait方法

两者都会让线程进入休眠状态,区别在于

(1)使用方法不一样:wait属于Object类的方法,sleep属于Thread类的方法

(2)thread.sleep()方法不会释放对象锁,是释放cpu,如果线程持有锁,那即使sleep()会使线程休眠,但是不会释放锁,

而obj.wai()t方法会释放对象锁,也会释放cpu

总之:sleep释放cpu,不释放锁

      wait释放cpu,释放锁

两个都释放cpu,但是sleep不释放锁,wait释放锁

(3)thread.sleep()可以不需要搭配synchronized使用,而obj.wait()必须搭配synchronized使用
 

http://www.lryc.cn/news/18558.html

相关文章:

  • c++笔记之构造函数中的default作用
  • 【代码随想录二刷】Day24-回溯-C++
  • Kubernetes中YAML 文件简介
  • 骨传导耳机是怎么发声的,骨传导耳机值得入手嘛
  • 会声会影2023官方新功能介绍
  • vue:pdf.js使用细节/隐藏按钮/设置、获取当前页码/记录阅读进度/切换语言(国际化)
  • RocketMQ实现延迟队列精确到秒级实现
  • 线性数据结构:数组 Array
  • 大数据开发-Hive
  • 《程序员新声》-Tech Lead 如何带领团队
  • 每日算法面试题
  • 高质量前端之自动化测试
  • 2023不伤人脉的全新商城分销,一劳永逸的消费分红
  • 【代码随想录训练营】【Day21】第六章|二叉树|530.二叉搜索树的最小绝对差|501.二叉搜索树中的众数|236. 二叉树的最近公共祖先
  • leaflet 导出图片,打印图片(A4横版或竖版)
  • Java面向对象:继承特性的学习
  • 问答系统(QA)调研
  • 商务租车的三大优势吸引企业以租代购
  • 蓝桥杯的比赛流程和必考点
  • 【数据结构】红黑树
  • 从C++的角度理解C#的Event
  • 商城进货记录交易-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)
  • 【正点原子FPGA连载】第十七章双核AMP实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南
  • 内存管理框架---页(一)
  • 华为OD机试真题Python实现【流水线】真题+解题思路+代码(20222023)
  • 「JVM 编译优化」Graal 编译器
  • 蓝牙标签操作指南
  • 嵌入式 Linux Shell编程
  • Web前端学习:一
  • SpringBoot集成Redis实现分布式会话