等待唤醒案例分析和实践
等待唤醒案例分析
wait:线程不再活动,不再参与调度,进入wait set中,因此不会浪费CPU资源,也不会去竞争锁了,这时的线程状态即时WAITING。
它还要等着别的线程执行一个特别的动作,也即是“通知(notify)”在这个对象上等待的线程从wait set中释放出来,重新进入到调度队列中
notify:则选取所通知对象的wait set中的一个线程释放;例如,参观有空位后,等待就餐最久的顾客最先入座。
notifyAll:则释放所有通知对象的wait set山东个全部线程。
等待唤醒案例代码实现
等待唤醒案例:线程之间的通信
创建一个顾客线程(消费者):告知老板要的包子的种类和数量,调用wait方法,放弃cpu的执行,进入到WAITING状态(无线等待)
创建一个老板线程(生产者):花了5秒做包子,做好包子之后,调用notify方法,唤醒顾客吃包子
注意:
顾客和老板线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个在执行
同步使用的锁对象必须保证唯一
只有锁对象才能调用wait和notify方法
obejct类中的方法
void wait()
在其他线程调用此对象的notify()方法或notifyAlL()方法前,导致当前线程等待。
void notify()
唤醒在此对象监视器上等待的单个线程。
会继续执行wait方法之后的代码
public class Demo01WaitAndNotify { public static void main(String[] args) { //创建锁对象,保证唯一 Object obj = new Object(); //创建一个顾客线程(消费者) new Thread(){ @Override public void run() { while (true){ //保证等待和唤醒只能有一个在执行需要使用名捕时间 synchronized (obj){ System.out.println("告诉老板要的数量"); //调用wait()方法,进入无限等待状态 try { obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("开吃"); } } } }.start(); //创建一个老板线程(生产者) new Thread(){ @Override public void run() { while (true){ try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } //保证等待和唤醒只能有一个在执行需要使用名捕时间 synchronized (obj){ System.out.println("花了5秒做包子,做好包子之后,告诉顾客,可以吃了"); obj.notify(); } } } }.start(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix