当前位置:网站首页>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状态
边栏推荐
- The uniapp/applet onload method executes the interpretation every time the page is opened
- 图论之Kruskal,最小生成树如何优雅解题?
- Do you know Dijkstra of graph theory?
- Scala基础语法入门(三)Scala中的各种运算符
- Ribbon负载均衡的深度分析和使用
- 方正璞华“劳动人事法律自助咨询服务平台”在武汉武昌区投入使用!
- MFC入门教程(深入浅出MFC)
- [C language] Analysis of function recursion (1)
- qt 编译报错 No rule to make target
- leetcode 504. Base 7 七进制数 (简单)
猜你喜欢
k8s之KubeSphere部署有状态数据库中间件服务 mysql、redis、mongo
How to improve the originality of self-media creation and create popular works?
wx-wow(微信小程序动效库)
供应磷脂-聚乙二醇-羧基,DSPE-PEG-COOH,DSPE-PEG-Acid,MW:5000
分享一个Chrome控制台数据获取的例子
RESTful style (detailed introduction + case implementation)
【C语言】函数哪些事儿,你真的get到了吗?(1)
SQL Server 2014 installation tutorial (nanny-level graphic tutorial)
Singleton pattern of seven kinds of writing, you know?
鲁大师7月新机性能/流畅榜:骁龙8+正面对决天玑9000+,性能跑分突破123万!
随机推荐
Good shooting js game source code
A powerful js pop-up alert plugin
js semi-circle loading progress animation js special effects
selenium chrome driver运行时的cannot determine loading status from target frame detached问题
SQL Server database generation and execution of SQL scripts
RISC-V instruction format and 6 basic integer instructions
How to use the database like tap water?|Tencent Cloud Database TDSQL-C
机器人碰撞检测方法形式化
[b01lers2020]Welcome to Earth-1
[typescript] Use the RangePicker component in antd to implement time limit the previous year (365 days) of the current time
什么是 commonjs2
Ribbon负载均衡的深度分析和使用
RestTemplate use: set request header, request body
80篇国产数据库实操文档汇总(含TiDB、达梦、openGauss等)
FreeRTOS--Priority Experiment
Summer training camp-week2 graph theory
Closures in JS
【C语言】手撕循环结构 ——do...while语句及循环练习题(1)
86.(cesium之家)cesium叠加面接收阴影效果(gltf模型)
【C语言】夏日一题 —— 求最大公约数和最小公倍数