package exercises;
import java.util.*;
/*题目: 采用Java 多线程技术,设计实现一个符合生产者和消费者问题的程序。
 *     对一个对象(枪膛)进行操作,其最大容量是12颗×××。
 *     生产者线程是一个压入线程,它不断向枪膛中压入×××;
 *     消费者线程是一个射出线程,它不断从枪膛中射出×××。
  */
public class  ThreadTestGun
{
public static void main(String[] args) 
{
GunClip clip=new GunClip();
Producer p=new Producer(clip);
Concumer c=new Concumer(clip);
p.start();
c.start();
}
}
class Producer extends Thread
{
private GunClip clip;
private List<Integer> list;
Producer(GunClip clip){
this.clip=clip;
}
public void run(){
for(int i=0;i<5;i++){         //让它生产5个弹夹
list=new ArrayList();
System.out.println("\n"+"机枪开始压入×××:"+"\n");
for(int j=0;j<12;j++){
list.add(j+1);
System.out.println("已压入第"+(j+1)+"颗×××");
}
clip.put(list);
   }
}
}
class Concumer extends Thread
{
     private GunClip clip;
Concumer(GunClip clip){
this.clip=clip;
}
public void run(){
while(true){
clip.get();
}
}
}
class GunClip     //弹夹     
{
private List<Integer> list=null;
private boolean bFull =false ;
public synchronized void put(List list){
if(!bFull){
this.list=list;
bFull=true;
notify();
}
try{
wait();
}catch(Exception e){
e.printStackTrace();
}
}
public synchronized void get(){
if(!bFull){
try{
wait();
}catch(Exception e){
e.printStackTrace();
   }
}
System.out.println("\n"+"机枪开始射出×××:"+"\n");
for(int i=list.size();i>0;i--){
            int j=(Integer)list.get(i-1);
System.out.println("已射出第"+j+"颗×××");
}
bFull=false;
notify();
}
}