消费者和生产模式是典型的软件应用场景,比如工厂生产出产品,先送到商店,消费者再到商店去买。
生产者不会每生产一个就送到商店去,一般是生产一定数量的产品,比如生产数量为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时,再恢复购买。