设为首页 加入收藏

TOP

设计模式之:生产者与消费者模式(一)
2017-10-10 12:58:57 】 浏览:7153
Tags:设计模式 生产者 消费者 模式

  生产者与消费者模式是《设计模式》的书籍中推荐的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("流水线生产开始..
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇反射空间编程 下一篇画了一张基于Spring Cloud的微服..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目