import java.util.ArrayList;
import java.util.List;
import java.util.Random;
//自定义类,描述仓库
public class StoreHouse
{
private List products = new ArrayList(); //仓库的所有商品的列表
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();
}
}