自动售票找零多线程(一)

2014-11-24 02:53:07 · 作者: · 浏览: 3

昨天有人在群里说了一个多线程售票的问题,当时没怎么注意,后来没事就自己做了一下,开始还觉得应该很简单,最后昨天都没做出来,今天早上在床上突然思路开阔,起来就完成了,唉,感叹啊,有时候还真的要睡睡,这种事情在我身上都发生好几次了,每次都是睡觉起来问题就可以解决了,呵呵。。。
我模拟的是一个自动售票机,当然可能程序还又bug,但先考虑这么多吧,我假设来买票的人是还算是个理性点的啊
模拟的是一台机器,其他都是人来这台机器买票,票是5元一张,买的时候可以说买多少张,然后给钱,程序自动售票并找零。顾客交了前后首先机器有个收钱的方法,这个方法是按照一定的原则来的,他会把钱按5、10、20、50、100分开来装,但由于钱的分发很多,我就采用了一个比较简单的机器会按从大到小来分钱,比如你给他55他就会分为50和5,你给35它就会氛围20+10+5,给45就是2*20+5。这就是机器收钱分开装了。
接着就是找零了,机器也有个找零的方法,根据要找的余额来看机器里面是否有相应的钱数,有就直接找了,没有就还要等待,等另外有人来买票,有对应的钱了才可以找。比如你开始去买1张票,但你给了10元,刚开张,机器里面没有5元的票子,机器肯定找不出来,他就会让你等,如果下一个人买票时候给了5元的票子,那么机器就可以找你钱了,大致情况就是这样啦。贴一下代码吧,以后自己也可以看看,说不定哪天自己就不小心删掉了。
机器代码:

Java代码
package com.thread;

import java.util.HashMap;
import java.util.Map;

public class TicketMachine {

private int ticket = 20;

private Map balance = new HashMap();

public final float TICKET_PRICE = 5.0F;

public float[] type = {5.0F , 10.0F , 20.0F , 50.0F , 100.0F};

public String[] strType={"五元" , "十元" , "二十元" , "五十元" , "一百元"};

public int getTicket(){
return ticket;
}

public void setTicket(int ticket){
this.ticket=ticket;
}

public Map getBalance(){
return this.balance;
}

//假设给的钱都是5的倍数
public void separate(float money){
//判断money是否是5的倍数,不是就舍去个位数转成5的倍数
float temp=money/5;
money=5*temp;
for(int i=0;i if(money<=type[i]){ //票只卖100以内
if(money==type[i]){
this.save(this.strType[i],1);
}else{
float temp1,temp2,temp3,temp4;
if((temp1=money/50)>0){

this.save(this.strType[3],(int)temp1);
money-=50*(int)temp1;
}
if((temp2=money/20)>0){
this.save(this.strType[2],(int)temp2);
money-=20*(int)temp2;
}
if((temp3=money/10)>0){
this.save(this.strType[1],(int)temp3);
money-=10*(int)temp3;
}
if((temp4=money/5)>0){
this.save(this.strType[0],(int)temp4);
money-=5*(int)temp4;
}
}
break;
}
}
}
//向balance一张一张的存钱
public void save(String str,int add){
Integer num= (Integer) this.getBalance().get(str);
if(num==null){
num=0;
}
this.balance.put(str, num+add);
}
//从balance中取钱找零
//sdel是应该减掉的数,它=del*type[str的地址],del是减去的次数
//如果失败map应该要恢复原样的
public float delete(String str,int del,float sdel,Map tempMap){
Integer num= tempMap.get(str);
if(num==null||num<1){
return sdel;
}else{
if(num>del){
tempMap.put(str, num-del);
return 0.0F;
}else{
tempMap.put(str, 0);
int temp=0;
for(int i=0;i if(str.equals(strType[i])){
temp=i;
}
}
return this.type[temp]*