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