java等待唤醒案例
package com.zr;
/*
等待唤醒案例:线程之间的通信
创建一个顾客线程(消费者):告知老板要的包子种类和数量,调用wait方法,放弃cpu的执行进入到WAITTING状态(无限等待)
创建一个老板线程(生产者):花了5秒做包子,做好包子之后,调用notify方法,唤醒顾客吃包子
注意:
顾客和老板线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个执行
同步使用的锁对象必须保证唯一
只有锁对象才能调用wait和notify方法
*/
public class DemoWaitAndNotify {
public static void main(String[] args) {
//创建唯一的锁对象
Object object=new Object();
//创建顾客线程
new Thread(new Runnable() {
@Override
public void run() {
//保证等待和唤醒机制只能有一个线程执行,需要使用同步技术synchronized
synchronized (object){
//告诉老板要的包子种类和数量
System.out.println("告诉老板要的包子种类和数量");
//等待老板做包子
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
//顾客吃包子
System.out.println("顾客吃包子中......");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("吃完了,包子真好吃");
}
}
}).start();
//创建老板线程
new Thread(new Runnable() {
@Override
public void run() {
//保证等待和唤醒机制只能有一个线程执行,需要使用同步技术synchronized
synchronized (object){
//老板用5秒做好包子
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("包子做好了,请享用");
//告诉顾客包子做好了,可以吃了
object.notify();
}
}
}).start();
}
}