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