您的位置:首页 > 大数据 > 人工智能

生产者与消费者--demo1---bai

2017-01-10 12:08 246 查看
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

//自定义类,描述仓库
public class StoreHouse
{
private List<String> products = new ArrayList<String>(); //仓库的所有商品的列表

public void add(String product)
{
this.products.add(product);
}
Random rd = new Random();
public String sale()  //随机从所有商品中,任取一件进行出售
{
int index = rd.nextInt(this.products.size());

//从数组中,删除序号为index的商品。并作为返回值返回。
String product = this.products.remove(index);
return product;
}

//获取仓库的商品个数
public int getSize()
{
return  this.products.size();
}
}


  

import java.util.Random;

//消费者线程。不断的消费
public class ConsumeThread extends  Thread
{
private StoreHouse house;//持有1个仓库

//构造函数中,传入仓库对象
public ConsumeThread(StoreHouse house)
{
this.house = house;
}

@Override
public void run() {
Random rd = new Random();
while(true)
{
synchronized (house)
{
if(house.getSize()==0)
{
System.out.println("仓库为空,消费者开始等待...");
//如果仓库为空,则本消费者线程进入等待状态。会释放同步锁。
try {
house.wait(); //释放同步锁,其他线程可以继续执行。
//Thread.sleep(3000);//不释放同步锁。所以其他线程无法继续执行。
//house.wait();
} catch (InterruptedException e) {

e.printStackTrace();
}
}
}

synchronized (house)
{
if (house.getSize() > 0) //只要仓库的库存大于0
{
String product = house.sale();
System.out.println("消费者从仓库中取走了 " + product);
}
}
try {
Thread.sleep(rd.nextInt(2000));
} catch (InterruptedException e) {

e.printStackTrace();
} //随机休息2秒以内的时间
}
}

}


  

import java.util.Random;

//生产者线程。不断的往仓库添加商品

public class ProduceThread  extends  Thread
{
private StoreHouse house;//持有1个仓库

//构造函数中,传入仓库对象
public ProduceThread(StoreHouse house)
{
this.house = house;
}

@Override
public void run()
{
Random rd = new Random();
//不断的往仓库添加商品
while(true)
{
synchronized (house)
{
//随机产生1个商品名
String product = "商品" + rd.nextInt(200);
//将该商品添加到仓库
house.add(product);
house.notifyAll();//通知所有其他处于wait状态的线程继续执行
System.out.println("生产者将 " + product + " 添加到仓库中");
}
try {
Thread.sleep(rd.nextInt(2000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //随机休息2秒以内的时间
}
}

}


  

public class Test
{
public static void main(String[] args)
{
//1 创建1个仓库对象,作为共享数据
StoreHouse house = new StoreHouse();
//2 创建生产者线程
ProduceThread pt = new ProduceThread(house);

//3 创建消费者线程
ConsumeThread ct1 = new ConsumeThread(house);
ConsumeThread ct2 = new ConsumeThread(house);
//4 启动线程
pt.start();
ct1.start();
ct2.start();

}
}


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