生产者和消费者模式概述(等待和唤醒机制)

生产者和消费者模式概述

 

 等待和唤醒方法

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

  

posted @ 2022-05-14 10:37  格兰芬多剁剁剁  阅读(62)  评论(0)    收藏  举报