线程,卖票

  

题目:某自动售票机有几个买票的操作平台,机里有20张票,一张卖5元,现在里面没现金,只有票,售票机只能放入10元跟5元。张三用10元来买一张票,售票机找不出零钱,需要等待,此时李四用五元来买一张票,售票机就可以找钱了。
 要求:使用多线程并用同步操作(synchronized,wait,notify)
  一种可能结果的打印信息如下:
 程序开始
 张三先生,欢迎买票
 张三先生,等待处理......
 程序结束
 张三先生,不好意思,零钱不够,请稍等
 李四先生,欢迎买票
 李四先生,等待处理......
 李四先生,恭喜你操作成功,现金:5元,买票1张
 李四先生,欢迎再来买票
 张三先生,感谢你的耐心等待,现在有零钱了
 张三先生,恭喜你操作成功,现金:10元,买票1张
 张三先生,欢迎再来买票

 

package com.test;

public class tickettread implements Runnable {
 private static int ticketNum = 20;
 private static int money5 ;//5元
    private static int money10;//机器上10元一张的数量
   
 private static int buyMoney;// 一次给的钱
 private Thread ticketSale;

 public tickettread(String threadname, int buymoney) {
  ticketSale = new Thread(this, threadname);
  System.out.println("线程,名称为:" + threadname);
  buyMoney = buymoney;
  ticketSale.start();
 }

 @Override
 public void run() {
  try {
   price(buyMoney);
  } catch (Exception e) {
   System.out.println(ticketSale.getName()+ ":..........Interrupted.....");
   e.printStackTrace();
  }

 }
 public synchronized void price(int cash)
 {
   if(cash==10){
            while(money5<1)
            {
       System.out.println(money10+":"+money5);
             System.out.println("没零钱");
 
              try {this.wait();} catch (InterruptedException e) {e.printStackTrace();} 
            }
                money10+=1;
    money5-=1;
    System.out.println("谢谢您的等待,有零钱了,找你5快"+money10+":"+money5);
  }else{
   money5+=1;
   ticketNum-=1;
   System.out.println("ticketNum"+ticketNum+money5);
  }
  this.notify();
  
 }
 /*public synchronized void sale() {
     try{
   if (ticketNum < buyNum) {
   if (ticketNum == 0) {
    System.out.println("卖光了");
   } else {
    System.out.println("只剩下" + ticketNum + "张票了");
   }
   this.wait();
  } else {// 有票卖
              System.out.println("有票买"+ticketNum);
    //应收得钱为:
   int cash=buyNum*5;
   if(buyMoney==cash){
    if(buyNum==1){
     money5+=1;
    }
    else{
     money10+=buyNum;
    }
    money+=cash;
    ticketNum-=buyNum;
    
    System.out.println("不用找钱,钱总数为:"+money+",余票未"+ticketNum);
          //唤醒等待的。。。。。。。。
    this.notify();
   }
   else{//(buyMoney!=cash)
                if((buyMoney>cash))
                {
                 if(money<buyMoney-cash){
                  System.out.println("零钱不够,请等候,");
                  this.wait();
                 }else{
                  System.out.println("感谢您的耐心等待,现在有零钱了");
                  System.out.println("操作成功,现金"+buyMoney+"元,买票"+buyNum+"张");
                  
                  //补下找钱的方法
                        //唤醒等待的。。。。。。。。
                  this.notify();
                 }
                  
                }else{//buyMoney<currentmoney,现金少于要支付的钱
                 this.wait(); 
                 System.out.println("现金少于要支付的钱");
                }
   }
  }
     
     }catch(Exception e){e.printStackTrace();}
  //this.notifyAll();
 }
*/
 

 
 public static class Client {

  public static void main(String[] args) {
   tickettread t1 = new tickettread("张三", 10);
   tickettread t2 = new tickettread("李四", 5);


  }
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值