多线程-等待唤醒

等待唤醒

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();
}
}

运行结果:

posted @ 2022-10-17 10:25  想见玺1面  阅读(17)  评论(0编辑  收藏  举报