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