编写Java应用程序模拟5个人排队买票。售票员只有1张五元的钱,电影票五元钱一张。
假设5个人的名字及排队顺序是:赵、钱、孙、李、周。
“赵”拿1张二十元的人民币买2张票, “钱”拿1张二十元的人民币买1张票,
“孙”1张十元的人民币买1张票, “李”拿1张十元的人民币买2张票,
“周”拿1张五元的人民币买1张票。
要求售票员按如下规则找赎:
(1)二十元买2张票,找零:1张十元;不许找零2张五元。
(2)二十元买1张票,找零:1张十元,1张五元;不许找零3张五元。
(3)十元买一张票,找零1张五元
代码:(这是目前我自己的水平所能想出来的比较好的一个思路了,如果您有更好的想法或是感觉我写的有问题,欢迎提出一起讨论)
class buy_tickets //临界资源是售票员手里的钱
{
private static int fivenumber=1,tennumber=0,twentynumber=0;//钱的张数可以根据这个来统计,比用一个放置整型的数组要方便很多
private int count = 0,money=0;// 票数和钱数
public synchronized void chan(int money,int count) {
if (money == 20 && count == 2) {
twentynumber++;//先收下钱
if(tennumber<1)
{
try {
System.out.println("赵稍等"+" 此时售票员手中的票为:5元有"+fivenumber+",10元有:"+tennumber+",20元有:"+twentynumber);
this.wait();
} catch (InterruptedException e) {}
}//最开始不能找钱,就告诉他,让他先等一会儿
while(tennumber<1) {
try {
this.wait();
} catch (InterruptedException e) {}
}//,之后的没有办法成功找钱,就继续进入等待状态
tennumber--;//把钱找给他
notify();//唤醒
System.out.println("应该找给赵1张10元,赵结束"+" 此时售票员手中的票为:5元有"+fivenumber+",10元有:"+tennumber+",20元有:"+twentynumber);//好了这个人结束了
}
//money == 20 && count == 1
else if (money == 20 && count == 1) {
twentynumber++;
if(tennumber<1||fivenumber<1)
{try {
System.out.println("钱稍等"+" 此时售票员手中的票为:5元有"+fivenumber+",10元有:"+tennumber+",20元有:"+twentynumber);
this.wait();
} catch (InterruptedException e) {}
}
while(tennumber<1||fivenumber<1) {
try {
this.wait();
} catch (InterruptedException e) {}
}//没有办法成功找钱,就继续进入等待状态
tennumber--;
fivenumber--;
notify();
System.out.println("应该找给钱1张10元、1张5元,钱结束"+" 此时售票员手中的票为:5元有"+fivenumber+",10元有:"+tennumber+",20元有:"+twentynumber
);
}
//money == 10 && count == 1
else if (money == 10 && count == 1) {
tennumber++;
if(fivenumber<1)
{
try {
System.out.println("孙稍等"+" 此时售票员手中的票为:5元有"+fivenumber+",10元有:"+tennumber+",20元有:"+twentynumber);
this.wait();
} catch (InterruptedException e) {}
}
while(fivenumber<1) {
try {
this.wait();
} catch (InterruptedException e) {}
}//没有办法成功找钱,就继续进入等待状态
fivenumber--;
notify();//唤醒
System.out.println("应该找给孙1张5元,孙结束"+" 此时售票员手中的票为:5元有"+fivenumber+",10元有:"+tennumber+",20元有:"+twentynumber);
}
else if (money == 10 && count == 2) {
tennumber++;
System.out.println("李结束"+" 此时售票员手中的票为:5元有"+fivenumber+",10元有:"+tennumber+",20元有:"+twentynumber);
notify();
}
else if (money == 5 && count == 1) {
fivenumber++;
System.out.println("周结束"+" 此时售票员手中的票为:5元有"+fivenumber+",10元有:"+tennumber+",20元有:"+twentynumber);
notify();
}
}
}
public class customer extends Thread//继承Thread类,创建多个线程
{
String name;
static buy_tickets buy=new buy_tickets();
public customer(String name) {
this.name=name;
}
public void run() {
synchronized(this.buy) {
if(name=="赵") buy.chan(20,2);
else if(name=="钱") buy.chan(20,1);
else if(name=="孙") buy.chan(10,1);
else if(name=="李") buy.chan(10, 2);
else if(name=="周") buy.chan(5,1);//调用上了互斥锁的方法来找钱
}
}
public static void main(String[] args) {
new customer("赵").start();
new customer("钱").start();
new customer("孙").start();
new customer("李").start();
new customer("周").start();
}
}