售电影票的小程序

              十分抱歉,对不起大家,对不起自己。。这几天确实太忙了,一遍忙着入党的事情,一边又要复习备考。今天终于有空能写博客了,在前面介绍了一些有关于线程的东西,那么今天就写一个售票的程序。

题目的要求:一张票是5元,赵先生有一张20元,想买两张票;钱先生有20元,想买一张票;孙先生有一张10元,想买一张票;李先生有10元,想买两张票;周先生只有一张5元钱,想买一张票。

程序贴出来了:

class TicketSeller            // 负责卖票的类
{
   int fiveNumber=1,tenNumber=0,twentyNumber=0; 
   public synchronized void  sellTicket(int receiveMoney,int buyNumber)
   { 
       if(receiveMoney==5)
       {
          fiveNumber=fiveNumber+1; 
          System.out.printf("\n%s给我5元钱,这是您的1张入场卷",Thread.currentThread().getName()); 
       }
       else if(receiveMoney==10&&buyNumber==2) 
       {
           tenNumber=tenNumber+1; 
           System.out.printf("\n%s给我10元钱,这是您的2张入场卷",Thread.currentThread().getName()); 
       }
       else if(receiveMoney==10&&buyNumber==1)           
        {  
          while(fiveNumber==0)   // 给出线程需等待的条件
            { 
                try { 
  System.out.printf("\n%30s靠边等",Thread.currentThread().getName());
                      this.wait();   // 线程进入等待状态
System.out.printf("\n%30s结束等待\n",Thread.currentThread().getName());
                    }
               catch(InterruptedException e)
                    {
                    }
            }
           fiveNumber=fiveNumber-1;
           tenNumber=tenNumber+1;
System.out.printf("\n%s给我10元钱,找您5元,这是您的1张入场卷",Thread.currentThread().getName());
        }
       else if(receiveMoney==20&&buyNumber==1)           
        {  
          while((fiveNumber<3&&tenNumber==0)||(fiveNumber==0))  // 给出线程需等待的条件
            { 
                try { 
                       System.out.printf("\n%30s靠边等",Thread.currentThread().getName());
                       this.wait();  // 线程进入等待状态
                       System.out.printf("\n%30s结束等待",Thread.currentThread().getName());
                    }
               catch(InterruptedException e)
                    {
                    }
            }
        fiveNumber=fiveNumber-1;
        tenNumber=tenNumber-1;
        twentyNumber=twentyNumber+1;
        System.out.printf("\n%s给20元钱,找您一张5元和一张10元,这是您的1张入场卷",Thread.currentThread().getName());
      }
     else if(receiveMoney==20&&buyNumber==2) 
      {
          while((fiveNumber<2&&tenNumber==0))   // 给出线程需等待的条件
          {
              try { 
                     System.out.printf("\n%30s靠边等\n",Thread.currentThread().getName());
                     this.wait();   // 线程进入等待状态
                     System.out.printf("\n%30s结束等待",Thread.currentThread().getName());
                  }
             catch(InterruptedException e)
                  {
                  }
          }
          tenNumber=tenNumber-1;
          twentyNumber=twentyNumber+1;
          System.out.printf("\n%s给20元钱,找您一张10元,这是您的2张入场卷",Thread.currentThread().getName());
      }
       this.notifyAll(); // 通知等待的线程结束等待
  }
}
class Cinema implements Runnable         // 实现Runnable接口的类
{  
   Thread zhao,qian,sun,li,zhou;           // 电影院中买票的线程
   TicketSeller seller;                    // 电影院的售票员
  Cinema()
   {
      zhao=new Thread(this);
      qian=new Thread(this);
      sun=new Thread(this);
      li=new Thread(this);
      zhou=new Thread(this);
      zhao.setName("赵");
      qian.setName("钱");
      sun.setName("孙");
      li.setName("李");
      zhou.setName("周");
      seller=new TicketSeller();
   } 
   public void run()
   {
       if(Thread.currentThread()==zhao)
       {
          seller.sellTicket(20,2);
       }
       else if(Thread.currentThread()==qian)
       {
          seller.sellTicket(20,1);
       }
       else if(Thread.currentThread()==sun)
       {
          seller.sellTicket(10,1);
       }
       else if(Thread.currentThread()==li)
       {
          seller.sellTicket(10,2);
       }
       else if(Thread.currentThread()==zhou)
       {
          seller.sellTicket(5,1);
       }
   }
}
public class SaleExample
{
   public static void main(String args[])
    {
        Cinema cinema=new Cinema();      
        cinema.zhao.start();
        try
          {
              Thread.sleep(1000); 
          } 
          catch(InterruptedException e)
          {
          }
        cinema.qian.start();
        try 
          {
             Thread.sleep(1000); 
          } 
          catch(InterruptedException e)
          {
          }
        cinema.sun.start();
        try 
           {
                 Thread.sleep(1000); 
           } 
          catch(InterruptedException e)
           {
           }
        cinema.li.start();
        try 
           {
                 Thread.sleep(1000); 
           } 
        catch(InterruptedException e)
           {
           } 
        cinema.zhou.start();
    }
}


在上述程序中,出现了wait()方法和notifyAll()方法,那么wait()方法跟我们常见的sleep()方法有什么区别呢,当一个线程执行sleep()方法时,他就会放弃CPU,转到阻塞状态。在sleep()休眠时间满后,该线程也不一定会立即执行,是因为其他线程可能正在运行且没有被调度为放弃执行,因此,在可运行池中等待获得CPU。wait()方法是Object类中的方法,wait()方法必须仍在synchronized block中,否则会抛出异常。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值