当前位置:网站首页>wait() ,notify(),notifyAll()以及wait()与sleep()比较
wait() ,notify(),notifyAll()以及wait()与sleep()比较
2022-08-02 13:13:00 【厚积薄发ض】
目录
使用wait()和notify可以很好地进行线程间通信,减少CPU资源的浪费
什么是等待和通知?
等待通知两个操作可以很好的解决多线程之间的并发执行.比如在饭店做饭,厨师要做好饭端给服务员,然后服务员在端给客人,在厨师正在做菜的过程中服务员就在等待中,等厨师做好菜之后按下铃就通知服务员来取菜.
线程也一样,线程A要进行计算结果,而线程B要利用线程A计算的结果,此时在线程A进行计算时,线程B就在等待,等线程A计算完之后立马通知线程B.两个线程很好地进行了线程间通信.
wait方法
wait就是进行等待,从运行状态到阻塞状态(WAITING),直到该线程被通知或者中断而停止;
wait执行流程
- wait()先要释放锁
- 等待通知(也可能被中断)
- 接收到通知,重新尝试获取锁(与其他线程竞争重新获取锁)
wait注意事项
- 由于wait第一步就要先释放锁,所以wait必须要在synchronized中使用,不在synchronized中使用就会报错,同时被加锁的对象要和调用wait()的对象是同一个对象
- wait()方法是object成员方法
notify方法
notify方法使对应的wait线程唤醒,从阻塞状态变为运行状态
notify注意事项
- notify同样也要在synchronized中使用,否则报错
- notify也是object成员方法
- 当调用notify方法时只是进行通知,要等到synchronized代码块执行完毕,此时才能释放锁,对应wait的线程才能尝试获取锁
- notify只能唤醒一个对应wait的线程,如果有多个线程呈WAITING状态,随机挑选一个唤醒(具体取决于JVM的实现)
notifyAll方法
notifyAll用来唤醒多个线程,将所有呈WAITING状态的线程都进行唤醒
- notifyAll方法也是object成员方法
- notifyAll方法同样在使用时也要进行加锁,在synchronized关键字中使用
代码演示:
public static volatile Object locker = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(()->{
synchronized(locker){
System.out.println("开始等待");
try {
locker.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("结束等待");
}
});
t1.start();
Thread t2 = new Thread(()->{
synchronized(locker){
System.out.println("请输入一个数字开始通知");
Scanner scan = new Scanner(System.in);
scan.nextInt();
locker.notify();
System.out.println("通知结束");
}
});
t2.start();
}
wait()和notify也能够有效避免"线程饿死"
什么是线程饿死???
线程饿死指的是线程反复在CPU上运行(但是并没有执行任务),这就导致其他线程没有在CPU上运行,这些线程就被称为线程饿死
而使用wait()和notify就可以很好地去避免.
我们可以让反复在CPU上执行的线程使用wait,让其没有在执行任务时先进行等待,等着他要开始执行任务时,在进行通知notify让它去CPU上进行.
wait和sleep的区别
- 从实现类看 , wait是object类成员方法,sleep是Thread类的方法
- 从唤醒方式来看 , wait方法要通过notify()方法进行通知唤醒,而sleep是等待时间到了立即被唤醒
- 从加锁来看 ,wait需要加锁要在synchronized中使用,而sleep不需要加锁
- 从释放锁不同 ,wait主动释放锁,sleep不释放锁
- 从线程状态看,wait在WAITING状态,而sleep是在TIMED_WAITING状态
边栏推荐
- 矩阵中的路径
- “二舅”火了,自媒体短视频“爆火”的基本要素,你知道吗?
- 【C语言】手把手带你写游戏 —— 猜数字
- MFC入门教程(深入浅出MFC)
- 无线振弦采集仪远程修改参数方式
- 【C语言】虐打循环练习题(2)
- qt 编译报错 No rule to make target
- Taurus.MVC V3.0.3 microservice open source framework released: Make the evolution of .NET architecture easier in large concurrency.
- Markdown怎么加入emoji
- selenium chrome driver运行时的cannot determine loading status from target frame detached问题
猜你喜欢
随机推荐
Redis全部
冰箱“扩容”的战事,在今夏格外猛烈
Scala基础语法入门(三)Scala中的各种运算符
数值的整数次方
你知道图论的Dijkstra吗?
How to improve the originality of self-media creation and create popular works?
sql concat() function
SQL Server database generation and execution of SQL scripts
麻烦问一下,对mysql 场景注入故障,是不是不是对mysql server 端注入故障,只是对ja
GCC版本升级到指定版本
Intouch Historian历史曲线配置导入导出
攻防世界----unfinish
图文短视频自媒体怎么创作?如何让点击量达到10W?
分享一个Chrome控制台数据获取的例子
【C语言】手把手带你写游戏 —— 猜数字
Introduction to Graph Neural Networks (GNN) "Recommended Collection"
Taurus.MVC V3.0.3 microservice open source framework released: Make the evolution of .NET architecture easier in large concurrency.
Closures in JS
高效代码静态测试工具Klocwork 2022.2——Portal全新升级、支持RLM
动态组件-component