首页 > 其他分享 >生产者消费者设计模式

生产者消费者设计模式

时间:2023-03-13 16:11:59浏览次数:37  
标签:count 消费者 生产者 Desk 汉堡包 flag desk 设计模式 public

public class Demo {

    /* 生产者步骤:
     * 1、判断桌子上是否有汉堡包
     * 2、如果有就等待,如果没有,就生产
     * 3、把生产的汉堡包放到桌子上
     * 4、唤醒消费者开吃
     * 
     * 消费者步骤:
     * 1、判断汉堡包剩余数量,如果没有了,跳出线程
     * 2、判断桌子上是否有汉堡包
     * 3、如果没有就等待
     * 4、如果有就吃,
     * 5、吃完后桌子上的汉堡包没有了,状态改为false,然后叫醒厨师继续做汉堡包
     *   汉堡包总量减1
     */
    public static void main(String[] args) {
        Desk desk = new Desk(true, 10);
        Foodie f = new Foodie(desk);
        Cookie c = new Cookie(desk);
        f.start();
        c.start();
    }

}
/**
 * 消费状态
 */
public class Desk {

    // 定义一个标记 flag
    // true表示桌子上有汉堡包,此时允许吃货Foodie(消费者线程)执行
    // false表示桌子上没有汉堡包,此时允许厨师Cookie(生产者线程)执行
    // public static boolean flag = false; 使用public static也可以,但是无法体现面向对象编程思想
    private boolean flag;

    // 汉堡包的总量
    // public static int count = 10;
    private int count;

    // 锁对象 (加final关键字是因为锁对象需要唯一,不能让别人去修改锁对象的地址值)
    // public static final Object lock = new Object();
    private final Object lock = new Object();

    public Desk() {}

    public Desk(boolean flag, int count) {
        this.flag = flag;
        this.count = count;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public Object getLock() {
        return lock;
    }

}
/**
 * 消费者线程
 */
public class Foodie extends Thread {

    private Desk desk;

    public Foodie(Desk desk) {
        this.desk = desk;
    }

    /*
     * 1、判断汉堡包剩余数量,如果没有了,跳出线程
     * 2、判断桌子上是否有汉堡包
     * 3、如果没有就等待
     * 4、如果有就吃,
     * 5、吃完后桌子上的汉堡包没有了,状态改为false,然后叫醒厨师继续做汉堡包
     *   汉堡包总量减1
     */
    @Override
    public void run() {
        while (true) {
            synchronized (desk.getLock()) {
                if (desk.getCount() == 0) {
                    System.out.println("今天吃了10个汉堡包了,不能再吃了!");
                    break;
                }
                if (desk.isFlag()) {
                    // 有,开吃
                    System.out.println("吃货把桌子上的汉堡包干掉!");
                    desk.setFlag(false);
                    // 使用什么对象当作锁,那么就必须用这个对象去调用等待和唤醒的方法
                    // notifyAll()叫醒这个锁上的所有线程,notify()随机叫醒单个线程
                    desk.getLock().notifyAll();
                    desk.setCount(desk.getCount() - 1);
                } else {
                    // 没有,等待
                    try {
                        desk.getLock().wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
/**
 * 生产者线程
 */
public class Cookie extends Thread {

    private Desk desk;

    public Cookie(Desk desk) {
        this.desk = desk;
    }

    /*
     * 1、判断桌子上是否有汉堡包
     * 2、如果有就等待,如果没有,就生产
     * 3、把生产的汉堡包放到桌子上
     * 4、唤醒消费者开吃
     */
    @Override
    public void run() {
        while (true) {
            synchronized (desk.getLock()) {
                if (desk.getCount() == 0) {
                    System.out.println("生产了10个汉堡包了,今天生产总数已达到,不用再生产了!");
                    break;
                }
                if (!desk.isFlag()) {
                    // 没有,生产
                    System.out.println("厨师生产了一个汉堡包!");
                    desk.setFlag(true);
                    desk.getLock().notifyAll();
                } else {
                    // 有,等待消费者吃
                    try {
                        desk.getLock().wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    }

}

 

标签:count,消费者,生产者,Desk,汉堡包,flag,desk,设计模式,public
From: https://www.cnblogs.com/weiduaini/p/17211787.html

相关文章

  • 前端设计模式——职责链模式
    职责链模式(ChainofResponsibilitypattern)是一种行为设计模式,用于将请求从一个对象传递到另一个对象,直到找到能够处理请求的对象为止。职责链模式通常涉及一系列处理对......
  • 前端设计模式——适配器模式
    适配器模式(AdapterPattern):将一个类的接口转化为客户端所期望的接口,使得原本不兼容的类可以一起工作。在前端开发中,可以使用适配器模式来处理不同浏览器之间的兼容性问题。......
  • 编程原则与设计模式
    编程原则SRP单一职责原则Aclassormoduleshouldhaveasingleresponsibility一个类或者模块只负责完成一个职责(或者功能)。不要设计大而全的类,要设计功能单一......
  • 设计模式(二十)----行为型模式之责任链模式
    1、概述在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,......
  • 设计模式之单例模式
    Java中的单例模式(SingletonPattern)是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。实现单例模式通常有两种方式:懒汉式和饿汉式。懒汉式单例模式是......
  • SpringCloud-创建服务消费者-Feign方式(附代码下载)
    场景在上面已经实现服务注册中心、服务提供者和以Ribbon方式实现服务消费者的前提下,使用另一种Feign方式实现服务消费者。FeignFeign是一个声明式的伪Http客户端,它使得写......
  • 从代码层面来讲,何时使用设计模式
    1工厂模式想通过名称获取对象2抽象工厂模式单个工厂不满足对象的生产3单例模式全局只有一个对象4建造者模式通过构造函数创建对象不方便,例如,构造函数参数太多5原型模式......
  • 设计模式(十九)----行为型模式之命令模式
    1、概述日常生活中,我们出去吃饭都会遇到下面的场景。定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方......
  • 前端设计模式——策略模式
    在前端开发中,策略模式是一种常用的设计模式,它可以让我们在不改变对象本身的情况下,通过修改其内部的算法实现不同的行为。策略模式常常被用于实现一些复杂的业务逻辑,特别是......
  • 设计模式系列一策略模式
    一.策略模式(StrategyPattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一......