一个多线程的题目,题主太笨了想不出来,题目应该不难

某自动售票机有几个买票的操作平台,机里有20张票,一张卖5元,现在里面没现金,
只有票,售票机只能放入10元跟5元。张三用10元来买一张票,售票机找不出零钱, 需要等待,此时李四用五元来买一张票,售票机就可以找钱了。
这样的一个程序怎么写呢?

 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);


  }
 }
}

ref: https://blog.csdn.net/c_4818/article/details/6690383

使用BlockingQueue,阻塞5元钞票队列,当有 put操作后,take就执行了。 生产者消费者模型~