题目:某自动售票机有几个买票的操作平台,机里有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);
}
}
}