三人去电影院买票 一个拿5元 一人拿十元 一人拿20元 规定每张电影票5元

本文介绍了一个基于Java的电影票售卖系统案例,通过线程同步机制处理不同金额购票情况,确保售票过程中的零钱找补正确无误。文章详细展示了如何使用synchronized关键字和wait/notifyAll方法实现多线程间的同步与等待,解决因零钱不足导致的购票延迟问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意 :

    电影院卖票 : 售票员初始时有3张5元的票 。每张票5元。

   三个人来买票 。一个人手里有5元,一个人手里有10元。一个人手里有20元。如果有零钱则购票成功,否则进行排队

  思路:把售票员的票单独定义一个类 ,用于存放初始的票数 。

            实现3个Runnable 类使用售票员类作为成员变量。三个类作为三位手持不同面额来进行购票的顾客。

ticket类

package com.SellTicket;

public class Ticket {
	
	public int a5 = 3;
	public int a10 = 0;
	public int a20 = 0;
	
	public Ticket() {
		
	}
	
	public void SetTicket(int t1,int t2,int t3) {
		this.a5 += t1;
		this.a10 += t2;
		this.a20 += t3;
	}
	
	public void getTicket() {
		System.out.println("五元:" + a5+" 十元:"+a10+" 二十元:"+a20 +"总额为"+(a5*5+a10*10+a20*20));
	}

}

          三位顾客

package com.SellTicket;

public class C1 implements Runnable{
	
	public Ticket ticket;
	
	public C1(Ticket tickets) {
		this.ticket = tickets;
	}

	@Override
	public void run() {
		
		synchronized(ticket) {//定义我是拿5元来买票的
			
			System.out.println(Thread.currentThread().getName() + "购票成功");
			ticket.SetTicket(1, 0, 0);
			ticket.getTicket();//打印当前零钱信息
			ticket.notifyAll();//唤醒其他全部等待的线程
		}
		
		
	}

}

package com.SellTicket;

public class C2 implements Runnable{

	public Ticket ticket;
	
	public C2(Ticket ticket1) {
		this.ticket = ticket1;
	}
	
	@Override
	public void run() {//定义我是拿10元买票的
		
		synchronized(ticket) {
			
			if(ticket.a5 <=0) {//我要进入等待状态
				System.out.println(Thread.currentThread().getName()+"现在没有零钱,我要进入等待状态");
				try {
					ticket.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			//到了这里说明ticket.a5 > 0了 我拿10元钱也能买票了
			System.out.println(Thread.currentThread().getName()+"购票成功");
			
			ticket.SetTicket(-1, 1, 0);//5元少一张 ,10元多一张
			ticket.getTicket();//打印当前零钱信息
			ticket.notifyAll();//唤醒全部等待线程

		}
	}
	

}

package com.SellTicket;

public class C3 implements Runnable{
	
	public Ticket ticket;
	public C3(Ticket tickets) {
		this.ticket = tickets;
	}

	@Override
	public void run() {
		// 我就是拿20元钱来买票的人
		synchronized(ticket) {
			if(ticket.a5 < 3 && (ticket.a5 < 1 && ticket.a10 < 1)){
				System.out.println(Thread.currentThread().getName() +"现在没有零钱,我需要等待");
			    try {
					ticket.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			System.out.println(Thread.currentThread().getName() + "购票成功");
			if(ticket.a5 >= 3) {//我用3张5元钱进行找零	
				ticket.SetTicket(-3, 0, 1);//5元少3张 ,20元多一张
			}else {
				ticket.SetTicket(-1, -1, 1);//5元少一张,10元少一张,20元多一张
			}
			
			ticket.getTicket();//获取当前票数信息
			ticket.notifyAll();
		
		}
		
	}

}

实现类:

package com.SellTicket;

public class Demo {

	public static void main(String[] args) {
		
		Ticket ticket =new Ticket();
		C1 c1 = new C1(ticket);
		C2 c2 = new C2(ticket);
		C3 c3 = new C3(ticket);
		
		Thread t1 = new Thread(c1,"5元来买票");
		Thread t2 = new Thread(c2,"10元来买票");
		Thread t3 = new Thread(c3,"20元来买票");
		
		t1.start();
		t2.start();
		t3.start();

	}

}

运行结果:

 

你可以编写一个简单的Java程序来模拟这个场景,这里是一个简化的例子: ```java import java.util.Scanner; class Ticket { private int price = 5; } class Customer { private String name; private int money; public Customer(String name) { this.name = name; } public void buyTicket(Ticket ticket) { if (money >= ticket.price) { System.out.println(name + "买了票,剩余:" + (money - ticket.price)); money -= ticket.price; } else { System.out.println(name + "的钱不够,无法购票"); } } public void pay(int amount) { money += amount; System.out.println(name + "支付了" + amount + ",当前余额:" + money); } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 客户列表 Customer zhang = new Customer("张某"); Customer shi = new Customer("李某"); Customer zao = new Customer("赵某"); // 售票员的现金 Customer ticketSeller = new Customer("售票员"); ticketSeller.pay(15); // 原有5,总共15 // 购票顺序 zhang.buyTicket(new Ticket()); // 张某先买,付20 shi.pay(10); // 李某付10 zao.buyTicket(new Ticket()); // 赵某付5 scanner.close(); } } ``` 在这个程序中,我们首先创建了`Customer`类来代表客户,每个客户都有名字和钱。然后,我们创建了一个`Ticket`类表示电影票,价格固定为5。在`main`函数中,模拟了购票过程。 当运行此程序时,它会按照描述的顺序显示每个客户的操作结果。注意,由于这里假设售票员最初就拥有足够的钱,如果需要考虑更复杂的交互,比如售票员找零,可以进步修改程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值