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

消费者和生产者模式

时间:2023-03-31 10:57:54浏览次数:23  
标签:消费者 Thread ProductFactory 生产者 factory 模式 products new public

class ProductFactory {
    //定义库存最大
    private int stock = 10;

    private LinkedList<String> products;

    public ProductFactory() {
        this.products = new LinkedList<>();
    }

    public synchronized void productsStock(String product) throws InterruptedException {

        while (stock == products.size()) {

            System.out.println("警告:线程(" + Thread.currentThread().getName() + ")准备生产产品,但产品池已满");

            wait();
        }
        try {
            Thread.sleep(1000);//根据需求为了便于观察结果,每消费一个产品,sleep 1000 ms
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        products.add(product);
        System.out.println("线程(" + Thread.currentThread().getName() + ")生产了一件产品,放在" + (Integer.valueOf(product)+1)+"商品位" + ";当前剩余商品" + products.size() + "个");
        notify();

    }

    /**
     * 消费方法
     */
    public synchronized void consumeStock() throws InterruptedException {
        while (products.size() == 0) {
            System.out.println("警告:线程(" + Thread.currentThread().getName() + ")准备消费产品,但当前没有产品");

            wait();
        }
        try {
            Thread.sleep(1000);//根据需求为了便于观察结果,每消费一个产品,sleep 1000 ms
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        String product = products.remove(0);
        System.out.println("线程(" + Thread.currentThread().getName() + ")消费了一件"+(Integer.valueOf(product)+1)+"号商品位商品"+ ";当前剩余商品" + products.size() + "个");
        notify();


    }


}

class Producer implements Runnable {

    private ProductFactory factory;

    public Producer(ProductFactory factory) {
        this.factory = factory;
    }


    @Override
    public void run() {
        int i=0;

        try {
            while (true) {
                factory.productsStock(String.valueOf(i));
                i++;
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

class Consume implements Runnable {
    private ProductFactory factory;

    public Consume(ProductFactory factory) {
        this.factory = factory;
    }

    @Override
    public void run() {

        try {
            while (true) {
                factory.consumeStock();

            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


public class DemoProduct {


    public static void main(String[] args) {

        ProductFactory productFactory = new ProductFactory();

        new Thread(new Consume(productFactory),"1号消费者").start();
        new Thread(new Consume(productFactory),"2号消费者").start();
        new Thread(new Consume(productFactory),"3号消费者").start();
        new Thread(new Producer(productFactory),"1号生产者").start();
        new Thread(new Producer(productFactory),"2号生产者").start();

    }

}

 

标签:消费者,Thread,ProductFactory,生产者,factory,模式,products,new,public
From: https://www.cnblogs.com/shaoyongwang/p/17275553.html

相关文章

  • 观察者模式(Observer)
    1,观察者模式  观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个“观察”该对象的其他对象。  又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会......
  • Spine在Unity 的URP模式下,描边的坑。
    在urp模式下,spine描边需要特殊处理,首先去。官网下载他们的urp拓展包,然后通过packagemanager导入到项目。打开包里outlineshadersurp场景。发现他们实现这个场景的时候,是在spine动画下面套了一个outline对象,这个outline对象有一个脚本叫做renderexistingmesh。将这个脚本......
  • 责任链模式
    概述《设计模式》一书中对于“责任链模式”的意图描述如下:使多个对象有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止一般的UML结构图如下所示:其中,Handler将会包含直接后继处理类succ......
  • 设计模式(三十)----综合应用-自定义Spring框架-自定义Spring IOC-定义bean、注册表相
    现要对下面的配置文件进行解析,并自定义Spring框架的IOC对涉及到的对象进行管理。<?xmlversion="1.0"encoding="UTF-8"?><beans>  <beanid="userService"class="com.itheima.service.impl.UserServiceImpl">    <propertyname=&qu......
  • IOS中KVO模式的解析与应用
    最近老翁在项目中多处用到了KVO,深感这种模式的好处。现总结如下:一、概述KVO,即:Key-ValueObserving,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。KVO其实也是“观察者”设计模......
  • (二十六)访问者模式
    1.概述访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。2.示例Visitor类,为该对象结构中ConcreteElement的每一个类声明一个Visit操作。Visitor.javapublicabstractclassVisitor{......
  • 直线模组常用的驱动模式有哪些?
    直线模组是工业生产中经常用到的直线运动单元,其驱动方式有很多种,但常用的驱动方式通常有两种,一种是滚珠丝杆传动,另一种是同步带传动。滚珠丝杆传动方式的特点是重复定位精度较高,最高精度可达±0.005mm,并且负载一般也比较大,在工业生产中通常被应用于对精度有一定要求的生产过程中。......
  • 单用户模式进centos系统修改root密码
    为虚拟机server重设管理密码1)重启系统,进入recovery恢复模式在读秒时候按e键,找到linux16行,按键盘End末尾添加空格rd.breakconsole=tty0按ctrl+x启动2)......
  • 《无尽之剑2》重大更新 新增ClashMob社交模式
    备受关注的《无尽之剑2》ClashMob模式终于亮相了,已在AppStore上架。ClashMob是一种新游戏模式,这种模式可以多人合作,通过联网和其他玩家一起挑战一个超大型的BOSS。胜利者......
  • 基于stm32mp157 linux开发板ARM裸机开发教程3:Cortex-A7 架构与工作模式(连载中)
    前言:目前针对ARMCortex-A7裸机开发文档及视频进行了二次升级持续更新中,使其内容更加丰富,讲解更加细致,全文所使用的开发平台均为华清远见FS-MP1A开发板(STM32MP157开发板)针对......