生产者和消费者模式

        消费者和生产模式是典型的软件应用场景,比如工厂生产出产品,先送到商店,消费者再到商店去买。

        生产者不会每生产一个就送到商店去,一般是生产一定数量的产品,比如生产数量为N时,再送到商店去,这样减少来回运输的成本。这样当商店的N个产品卖完时,消费者再来买时需要等待(wait),当商店有N个产品未卖时,生产者需要停止生产,等待产品销售,产品量小于N时再开始生产。

        下面以代码来实现上面的场景:

生产类:

/**
 * 生产者
 */
public class Producer implements Runnable{
	private Shop s;
	
	public Producer(Shop s) {
		this.s = s;
	}

	/**
	 * 生产产品
	 */
	public void produce(Product p){
		s.purchase(p);
	}

	public void run() {
		for(int i=0;i<20;i++){
			Product p = new Product();
			p.setName("product" + i);
			s.purchase(p);
		}
	}

}

  消费类:

/**
 * 消费者
 */
public class Consumer implements Runnable{
	private Shop s;

	public Consumer(Shop s) {
		this.s = s;
	}

	/**
	 * 购买产品
	 */
	public Product buy(){ 
		Product p = s.sell();
		return p;
	}

	public void run() {
		for(int i=0;i<20;i++){
			Product p = buy();
			System.out.println(p.getName());
		}
	}
	
}

 商店类:

/**
 * 商店
 */
public class Shop {
	//库存最大值
	private int size = 10;
	List<Product> _list = new ArrayList<Product>();

	/**
	 * 销售产品
	 */
	public synchronized Product sell() {
		if(_list.size()<=0){
			try {
				// wait方法一般用在synchronized中
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		} else {
			notify();
		}
		return _list.remove(_list.size()-1);
	}
	
	/**
	 * 采购产品
	 * @param p
	 */
	public synchronized void purchase(Product p){
		if(_list.size()>=size){
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		} else {
			notify();
		}
		_list.add(p);
	}

}

 产品类:

/**
 * 产品
 */
public class Product {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}

 测试类:

public class ProcessTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Shop s = new Shop();
		
		Producer p = new Producer(s);
		Thread _p = new Thread(p);
		
		Consumer c = new Consumer(s);
		Thread _c = new Thread(c);
		
		_p.start();
		_c.start();
	}

}

 处理场景是这样的,商店不停采购和销售产品,但商店的库存有限,只能存放定量产品,当商店库存满时,停止采购,此时生产者处于暂停状态,直到商店库存量小于最大值时恢复生产,消费者不停购买产品,当商店的产品库存量为0时,消费者停止购买,处于等待状态,等商店库存量大于0时,再恢复购买。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值