package awt;//Playing类 相当于缓冲区!加互斥的缓冲区;
public class Playing {
  private int value ;
  private boolean isEmpty = true;  //互斥锁的标志(信号量);  
  //放值
  synchronized void put(int i)
  {
  if(!isEmpty)
  {
  try
  {
this.wait(5);          //挂起,释放互斥锁,进入互斥锁的等待队列;
   }
  catch (InterruptedException e)
  {
e.printStackTrace();
  }  
  }
  value = i;
  isEmpty = false ;                    
  this.notifyAll();                       //唤醒其他线程,和wait匹配使用!
  }
  
  //取值
    synchronized int get()
    {
     if(isEmpty)
     {
     try 
     {
this.wait(5);             //挂起,释放互斥锁,进入互斥锁的等待队列;   
  }
     catch (InterruptedException e)
     {
e.printStackTrace();
  }  
    }
  isEmpty = true ;
  this.notifyAll();                        //唤醒其他线程,和wait匹配使用!
  return value ;              
    }  
public static void main(String[] args) 
{
Playing play = new Playing(); //线程体的执行对象
(new Sender(play)).start();
(new Receiver(play)).start();
}
}   //发牌线程;
class Sender extends Thread
{
private Playing play;
public Sender(Playing play)
{
this.play = play;
}
public void run()
{
for(int i = 1; i<=54;i++)
{
play.put(i);
System.out.println("Sender put:"+i);
}
}
}//收牌线程
class  Receiver extends Thread
{
private Playing play;
public Receiver(Playing play)
{
this.play = play ;
}
public void sun()
{
for(int i = 1; i<=54;i++)
     System.out.println("Receiver get: "+play.get());
}
}