设计模式之:生产者与消费者模式

  生产者与消费者模式是《设计模式》的书籍中推荐的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

原文地址:https://www.cnblogs.com/mistwalker/p/7421179.html