当前位置:网站首页>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状态
边栏推荐
- 节省50%成本!京东云重磅发布新一代混合CDN产品
- 【C语言】细品分支结构——if-else语句
- How to use the database like tap water?|Tencent Cloud Database TDSQL-C
- The uniapp/applet onload method executes the interpretation every time the page is opened
- 【C语言】细品分支结构——switch语句
- Good shooting js game source code
- 企业用直播平台能实现什么
- js true 3d histogram plugin
- 基于flask商城的管理员功能
- scrapy框架初识1
猜你喜欢
随机推荐
RESTful style (detailed introduction + case implementation)
Introduction to Graph Neural Networks (GNN) "Recommended Collection"
基于 WeihanLi.Npoi 实现excel导入时纯汉字的日期转换
PHP+MYSQL [Student Information Management System] (Minimalist Edition)
sql concat() function
3 ways for OpenFeign to set headers
高效代码静态测试工具Klocwork 2022.2——Portal全新升级、支持RLM
Ribbon负载均衡的深度分析和使用
.Net 5.0 Quick Start Redis
wx-wow(微信小程序动效库)
PGSQL database to realize the import and export
【C语言】夏日一题 —— 如何判断素数?
企业用直播平台能实现什么
冰箱“扩容”的战事,在今夏格外猛烈
路由-嵌套路由
Set proxy server (Google+IE) "Recommended Collection"
【622. 设计循环队列】
WPF效果第一百九十三篇之登录实现
嵌入式系统驱动初级【2】——字符设备驱动基础上_基础框架
Flashback Technology of Oracle Database