zoukankan      html  css  js  c++  java
  • 设计模式之:生产者与消费者模式

      生产者与消费者模式是《设计模式》的书籍中推荐的23种模式之一,下面我们根据示例实现此模式的代码例子:

    生产者A:

    //生产者A
    public class ProducerA  extends Thread{
    
        // 生产一个商品
        private void produceGoods() {
            String goodsName = ""+System.currentTimeMillis();
            Goods good = new Goods(goodsName);
    
            synchronized (GoodsStore.getInstance().goodsList) {//同步
                System.out.println("创建商品A:"+good.getGoodsName());
                GoodsStore.getInstance().goodsList.add(good);
            }
    
        }
    
        @Override
        public void run() {
            while(true){//循环生成商品
                long sleepTime = (long) (Math.random()*1000);
    
                try {
                    Thread.sleep(sleepTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                this.produceGoods();
            }
        }
    }

     

    生产者B:

    //生产者B
    public class ProducerB  extends Thread{
    
    // 生产一个商品
    private void produceGoods() {
    String goodsName = "" + System.currentTimeMillis();
    Goods good = new Goods(goodsName);
    
    synchronized (GoodsStore.getInstance().goodsList) {//同步
    System.out.println("创建商品B:"+good.getGoodsName());
    GoodsStore.getInstance().goodsList.add(good);
    }
    
    }
    
    @Override
    public void run() {
    while(true){//循环生成商品
    long sleepTime = (long) (Math.random()*1000);
    
    try {
    Thread.sleep(sleepTime);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    
    this.produceGoods();
    }
    }
    }
    
    消费者A:
    //消费者A
    public class ConsumerA extends Thread {
    
        // 消费一个商品
        private void consumerGoods() {
            Goods good = GoodsStore.goodsList.getFirst();
    
            synchronized (GoodsStore.goodsList) {
                System.out.println("消费商品A:" + good.getGoodsName());
                GoodsStore.goodsList.remove(good);
            }
        }
    
        @Override
        public void run() {
            while (true) {
                long sleepTime = (long) (Math.random() * 1200);
    
                try {
                    Thread.sleep(sleepTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                System.out.println("仓库商品数量:" + GoodsStore.goodsList.size());
    
                if (GoodsStore.goodsList.size() > 0) {
                    this.consumerGoods();
                }
            }
        }
    }

    消费者B:

    //消费者B
    public class ConsumerB extends Thread {
    
        // 消费一个商品
        private void consumerGoods() {
            Goods good = GoodsStore.goodsList.getFirst();
    
            synchronized (GoodsStore.goodsList) {
                System.out.println("消费商品B:" + good.getGoodsName());
                GoodsStore.goodsList.remove(good);
            }
        }
    
        @Override
        public void run() {
            while (true) {
                long sleepTime = (long) (Math.random() * 1200);
    
                try {
                    Thread.sleep(sleepTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                System.out.println("仓库商品数量:" + GoodsStore.goodsList.size());
    
                if (GoodsStore.goodsList.size() > 0) {
                    this.consumerGoods();
                }
            }
        }
    }

    商品类:
    //商品类
    public class Goods {
    
        private String goodsName;
    
        public Goods(String goodsName){
            this.goodsName = goodsName;
        }
    
        public String getGoodsName() {
            return goodsName;
        }
    
        public void setGoodsName(String goodsName) {
            this.goodsName = goodsName;
        }
    
    
    }

    商品仓库:

    import java.util.LinkedList;
    
    //商品仓库
    public class GoodsStore {
    
        //商品列表
        public static LinkedList<Goods> goodsList;
    
        public static GoodsStore goodsStore;
    
        //创建单例对象
        static{
            goodsStore = new GoodsStore();
            goodsList = new LinkedList();//构造一个空的对象
        }
    
        // 单例对象
        public static GoodsStore getInstance() {
            return goodsStore;
        }
    }

    测试类:

    //测试类
    public class Test {
    
        public static void main(String[] args) {
            System.out.println("流水线生产开始......");
    
            Thread producerA = new ProducerA();
            producerA.start();
    
            Thread producerB = new ProducerB();
            producerB.start();
    
            Thread consumerA = new ConsumerA();
            consumerA.start();
    
            Thread consumerB = new ConsumerB();
            consumerB.start();
        }
    
    }
    
    

    运行结果如下:

    流水线生产开始……
    创建商品A:1503498407356
    仓库商品数量:1
    消费商品A:1503498407356
    创建商品A:1503498407430
    创建商品B:1503498407492
    仓库商品数量:2
    消费商品B:1503498407430
    仓库商品数量:1
    消费商品A:1503498407492
    创建商品A:1503498407856
    仓库商品数量:1
    消费商品B:1503498407856
    创建商品B:1503498408281
    仓库商品数量:1
    消费商品A:1503498408281
    创建商品A:1503498408527
    仓库商品数量:1
    消费商品B:1503498408527
    仓库商品数量:0
    仓库商品数量:0
    创建商品A:1503498408792
    创建商品B:1503498409095
    创建商品A:1503498409425
    仓库商品数量:3
    消费商品B:1503498408792
    创建商品B:1503498409686
    仓库商品数量:3
    消费商品A:1503498409095
    仓库商品数量:2
    消费商品B:1503498409425
    创建商品B:1503498409992
    仓库商品数量:2
    消费商品B:1503498409686
    创建商品A:1503498410131
    创建商品B:1503498410206
    仓库商品数量:3
    消费商品A:1503498409992
    仓库商品数量:2
    消费商品A:1503498410131

  • 相关阅读:
    Codeforces 845E Fire in the City 线段树
    Codeforces 542D Superhero's Job dp (看题解)
    Codeforces 797F Mice and Holes dp
    Codeforces 408D Parcels dp (看题解)
    Codeforces 464D World of Darkraft
    Codeforces 215E Periodical Numbers 容斥原理
    Codeforces 285E Positions in Permutations dp + 容斥原理
    Codeforces 875E Delivery Club dp
    Codeforces 888F Connecting Vertices 区间dp (看题解)
    Codeforces 946F Fibonacci String Subsequences dp (看题解)
  • 原文地址:https://www.cnblogs.com/mistwalker/p/7421179.html
Copyright © 2011-2022 走看看