多线程-等待唤醒
等待唤醒
Wating状态在API中介绍为:一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态
做一个案例来演示
案例分析
创建一个顾客线程(消费者):告知老板要的包子的种类和数量 调用wait方法 放弃cpu的执行 进入到WAITING状态(无限等待)
创建一个老板线程(生产者):花了5秒做包子 做好包子之后 调用notify方法 唤醒顾客吃包子
代码实现
注意:
顾客和老板线程必须使用同步代码块包裹起来 保证等待和唤醒只能由一个执行
同步使用的锁对象必须保证唯一
只有锁对象才能调用wait和notify方法
代码:
public class DemoWait {
public static void main(String[] args) {
Object o=new Object();
//顾客线程
new Thread(){
@Override
public void run() {
//创建同步锁
synchronized (o){
System.out.println("告知老板要的包子的种类和数量");
try {
o.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
//唤醒后执行的代码
System.out.println("包子做好了 开吃");
}
}
}.start();
//老板线程
new Thread(){
@Override
public void run() {
//花五秒做包子
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o){
System.out.println("包子做好了");
//唤醒上一个线程
o.notify();
}
}
}.start();
}
}
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本