package programingModel;
	/*
 * 生产者与消费者模型
 * 多线程的使用
 */
	//主函数类
public class ProductorAndConsumer {
	 public static void main(String[] args)
 {
  //定义存储数据的仓库
  Storage storage=new Storage(100,0);
  
  //生产者
  Productor p1=new Productor(10,storage);
  Productor p2=new Productor(50,storage);
  Productor p3=new Productor(70,storage);
  Productor p4=new Productor(20,storage);
  Productor p5=new Productor(60,storage);
  Productor p6=new Productor(40,storage);
  Thread tp1=new Thread(p1);
  Thread tp2=new Thread(p2);
  Thread tp3=new Thread(p3);
  Thread tp4=new Thread(p4);
  Thread tp5=new Thread(p5);
  Thread tp6=new Thread(p6);
	  //消费者
  Consumer c1=new Consumer(25,storage);
  Consumer c2=new Consumer(60,storage);
  Consumer c3=new Consumer(40,storage);
  Consumer c4=new Consumer(10,storage);
  Consumer c5=new Consumer(50,storage);
  Consumer c6=new Consumer(20,storage);
  Consumer c7=new Consumer(15,storage);
  Consumer c8=new Consumer(30,storage);
  Thread tc1=new Thread(c1);
  Thread tc2=new Thread(c2);
  Thread tc3=new Thread(c3);
  Thread tc4=new Thread(c4);
  Thread tc5=new Thread(c5);
  Thread tc6=new Thread(c6);
  Thread tc7=new Thread(c7);
  Thread tc8=new Thread(c8);
  
  //开始进程
  tp1.start();
  tp2.start();
  tp3.start();
  tp4.start();
  tp5.start();
  tp6.start();
  tc1.start();
  tc2.start();
  tc3.start();
  tc4.start();
  tc5.start();
  tc6.start();
  tc7.start();
  tc8.start();
 }
}
	//存储模型
class Storage
{
 private int maxStorage;   //定义最大存储量
 private int currentStorage;  //定义已使用的存储量
 
 public Storage(int max,int cur)
 {
  maxStorage=max;
  currentStorage=cur;
 }
 public int getMaxStorage() {
  return maxStorage;
 }
 public void setMaxStorage(int maxStorage) {
  this.maxStorage = maxStorage;
 }
 public int getCurrentStorage() {
  return currentStorage;
 }
 public void setCurrentStorage(int currentStorage) {
  this.currentStorage = currentStorage;
 }
 //接收来自生产者生产的产品
 public boolean inProduct(int nProduct)
 {
  if(currentStorage+nProduct>maxStorage)
  {
   System.out.println("仓库已满!");
   return false;
  }
  else
  {
   currentStorage+=nProduct;
   System.out.println("仓库产品+"+nProduct+"  "+"仓库剩余产品:"+currentStorage);
   return true;
  }
  /*
  synchronized(currentStorage)
  {
   while(currentStorage+nProduct>maxStorage)
   {
    try {
     currentStorage.wait();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
   currentStorage+=nProduct;
   System.out.println("产品已进入仓库 数量:"+nProduct+"仓库已有数量"+getCurrentStorage());
   currentStorage.notify();
  }
  */
 }
 //向消费者提***品
 public boolean outProduct(int nConsume)
 {
  if(currentStorage<nConsume)
  {
   System.out.println("仓库数量不足!");
   return false;
  }
  else
  {
   currentStorage-=nConsume;
   System.out.println("仓库产品-"+nConsume+"  "+"仓库剩余产品:"+currentStorage);
   return true;
  }
  /*
  synchronized(currentStorage)
  {
   while(currentStorage<nConsume)
   {
    try {
     currentStorage.wait();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
   currentStorage-=nConsume;
   System.out.println("已从仓库中取出 数量:"+nConsume+"仓库剩余数量"+getCurrentStorage());
   currentStorage.notify();
  }*/
 }
}
//生产者模型
class Productor implements Runnable
{
 private int produce;  //生产产品数量
 private Storage storage; //生产产品存储到哪个仓库
 
 public Productor(int produce,Storage storage)
 {
  this.produce=produce;
  this.storage=storage;
 }
 //get set方法
 public int getProduction() {
  return produce;
 }
	 public void setProduction(int production) {
  this.produce = production;
 }
	 public Storage getStorage() {
  return storage;
 }
	 public void setStorage(Storage storage) {
  this.storage = storage;
 }
 //生产者生产
 public boolean product()
 {
  return storage.inProduct(produce);
 }
 //执行线程时所做处理
 
@Override
 public void run() {
  synchronized(storage)
  {
   while(!product())
   {
    try {
     storage.wait();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
   storage.notifyAll();
  }
  /*
  synchronized(storage) 
  {
   while(!product())
   {
    System.out.println("产品未进入仓库 数量:"+produce+"仓库空间"+(storage.getMaxStorage()-storage.getCurrentStorage()));
    try {
     this.wait();
    } catch (InterruptedException e) {
    }
   }
   System.out.println("产品已进入仓库 数量:"+produce+"仓库已有数量"+storage.getCurrentStorage());
   this.notifyAll();
  }
  */
 /* product();*/
 }
}
//消费者模型
class Consumer implements Runnable
{
 private int need;   //消费产品数量
 private Storage storage; //获取产品数量的仓库
 
 public Consumer(int need,Storage storage)
 {
  this.need=need;
  this.storage=storage;
 }
 //get set 方法
	 public int getNeed() {
  return need;
 }
	 public void setNeed(int need) {
  this.need = need;
 }
	 public Storage getStorage() {
  return storage;
 }
	 public void setStorage(Storage storage) {
  this.storage = storage;
 }
 
 //消费者消耗
 public boolean consume()
 {
  return storage.outProduct(need);
 }
 
@Override
 public void run()
 {
  synchronized(storage)
  {
   while(!consume())
   {
    try {
     storage.wait();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
   storage.notifyAll();
  }
  /*
  synchronized(storage) 
  {
   while(!consume())
   {
    System.out.println("未能从仓库取出  数量:"+need+"仓库存在数量"+storage.getCurrentStorage());
    try {
     this.wait();
    } catch (InterruptedException e) {
    }
   }
   System.out.println("已从仓库中取出 数量:"+need+"仓库剩余数量"+storage.getCurrentStorage());
   this.notifyAll();
  }*/
  /*consume();*/
 }
}