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

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();
		
	}
}

  

原文地址:https://www.cnblogs.com/ipetergo/p/6268894.html