多线程问题:编写Java应用程序模拟5个人排队买票

编写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();
		}
}
  • 14
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值