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

  • 相关阅读:
    《Spring in action 4》(十一)SSM + Redis
    git 上传时报文件已存在的错
    JQuery--find与filter
    初识mysql
    并发--模块整理
    守护进程与守护线程
    用string模块生成随机验证码
    loggin 模块及其单例模式
    TCP协议--黏包现象
    网络编程---tcp/udp协议
  • 原文地址:https://www.cnblogs.com/mistwalker/p/7421179.html
Copyright © 2011-2022 走看看