生产者和消费者模式概述(等待和唤醒机制)
生产者和消费者模式概述
等待和唤醒方法
Object类的等待和唤醒方法:
void wait():导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法
void notify():唤醒等待对象监视器的单个线程
void notifyAll():唤醒等大对象监视器的所有线程
套路:
1.while(true)死循环
2.synchronized 锁,锁对象要唯一
3.判断:共享数据是否结束,结束--》跳出循环
4.判断:共享数据是否结束,未结束--》执行题目逻辑
package com.itheima.threaddemo14;
public class Desk {
//定义一个标记
//true--》有汉堡,允许吃货执行
//false--》没有汉堡,允许厨师执行
public static boolean flag = false;
//汉堡的总数量
public static int count=10;
//锁对象
public static final Object lock = new Object();
}
package com.itheima.threaddemo14;
public class Cooker extends Thread{
@Override
public void run() {
/*生产者步骤:
1.判断桌子上是否有汉堡
有--》等待
没有--》生产
2.把汉堡放在桌子上
3.叫醒等待的消费者开吃
*/
while (true){
synchronized (Desk.lock){
if (Desk.count==0){
break;
}
if (Desk.flag){
//桌子上有汉堡--》等待
try {
Desk.lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
//桌子上没有汉堡--》生产汉堡
System.out.println("厨师正在制作汉堡");
Desk.flag=true;
Desk.lock.notifyAll();
}
}
}
}
}
package com.itheima.threaddemo14;
public class Foodie extends Thread{
@Override
public void run() {
/*消费者步骤:
1.判断桌子上是否有汉堡
2.没有--》等待
3.有--》开吃
吃完以后,桌子上没有汉堡--》叫醒等待线程的生产者继续生产
汉堡总数量-1
*/
while(true){
synchronized (Desk.lock){
if (Desk.count==0){
break;
}
if (Desk.flag){
//有--吃
Desk.count--;
System.out.println("吃货在吃汉堡");
Desk.flag=false;
Desk.lock.notifyAll();
}else {
//没有--等待
//使用什么对象当作锁,就必须用这个对象调用等待唤醒方法
try {
Desk.lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
package com.itheima.threaddemo14;
public class Demo {
public static void main(String[] args) {
/*消费者步骤:
1.判断桌子上是否有汉堡
2.没有--》等待
3.有--》开吃
4.吃完以后,桌子上没有汉堡--》叫醒等待线程的生产者继续生产
汉堡总数量-1
*/
/*生产者步骤:
1.判断桌子上是否有汉堡
有--》等待
没有--》生产
2.把汉堡放在桌子上
3.叫醒等待的消费者开吃
*/
Cooker cooker = new Cooker();
Foodie foodie = new Foodie();
cooker.start();
foodie.start();
}
}


浙公网安备 33010602011771号