您的位置:首页 > 编程语言 > Java开发

java 多线程经典例子——生产者与消费者的问题

2012-08-01 14:17 756 查看
产品名称类:


public class Product {
//产品名称
private String name;

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

}
生产者类:
/**
* 生产者
* @author 饭香
*
*/
public class Producer implements Runnable{
private Shop shop;//要去送货的商店
public Producer(Shop shop){
this.shop=shop;
}
public void run() {
for(int i=0;i<100;i++){
shop.produ();
}
}

}

消费者类

/**
* 消费者
* @author 饭香
*
*/
public class Cousumer implements Runnable{

private Shop shop;//要去消费的商店
public Cousumer(Shop shop){
this.shop=shop;
}
public void run() {
for(int i=0;i<100;i++){//消费100次
shop.cousu();
}
}

}
模拟商店(一切围绕商店,商店只能有一个,产品随便多个实例.这个也是别人问我总是出错的地方.对象思想)

import java.util.ArrayList;
import java.util.List;
/**
* 模拟商店 (进货/销售)
* @author fx
*
*/
public class Shop {
private static int i=0;
//产品的容器;达到容器暂停生产,消费到0等待生产
private static List<Product> list;
static{
list= new ArrayList<Product>();
}
/**
* 生产产品
*/
public synchronized void produ(){
if(list.size()>=5){
try {
System.out.println("--------------生产商品"+i+"时,达到了总数暂停生产-------");
this.wait();//进入休眠
} catch (InterruptedException e) {
System.out.println(e.toString());
e=null;
}
} //生产商品
Product product= new Product();
product.setName("商品"+i);
list.add(product);
System.out.println("生产了商品---->"+product.getName()+"商品总数"+i);
System.out.println("容器容量"+list.size());
i++;
super.notify();

}

/**
* 消费产品
* @return
*/
public synchronized void cousu(){
if(list.size()==0){//消费完时,挂起
System.out.println("+++++++++++++++++++++++商品消费完了.等待+++++++++++++++=");
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println(e.toString());
e=null;
}
}
Product product=list.get(0);
list.remove(0);
System.out.println("消费了获得了商品-->"+product.getName());
System.out.println("容器容量"+list.size());
super.notify();

}
}


测试代码类:

public static void main(String[] args) {
Shop shop=new Shop();//商店
Producer pro=new Producer(shop);
Cousumer cou = new Cousumer(shop);
new Thread(pro,"pro").start();
new Thread(cou,"cou").start();
}


转自: http://51even.iteye.com/blog/767935
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: