多线程实现不连续售票

实现一个由A、B、C三个窗口同时销售100张票的系统

1.  创建3个线程分别代表三个窗口(10分)

2.  三个窗口同时开始售票,要求打印出每个窗口打印的售票情况(10分)

3.  每个窗口不得连续售票。当剩余票为0时,线程停止运行(10分)


创建一个票类作为线程操作的资源

public class Ticket{
	int tickets;
	boolean flag = true;
	// 传入需要卖的票的总票数
	public Ticket(int tickets) {
		this.tickets = tickets;
	}

	public synchronized void saleTick() throws Exception {
		while(flag){
			if(tickets > 0){
				//每200毫秒卖一张票
				Thread.sleep(200);
				System.out.println(Thread.currentThread().getName()+
						"  卖出了"+(tickets--)+"号票");
				//在进入等待之前,先唤醒其他线程
				this.notifyAll();
				//卖完一张票后开始等待被唤醒
				this.wait();
			}else{
				flag = false;
				//结束循环前,唤醒所有在等待的线程
				this.notifyAll();
			}
		}
	}
}

创建销售线程: 

public class SaleWin implements Runnable{
	private Ticket ticket;
	
	public SaleWin(Ticket ticket) {
		this.ticket = ticket;
	}
	@Override
	public void run() {
		while(ticket.flag){
			try {
				ticket.saleTick();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

创建测试类:

public class Test {
	public static void main(String[] args) {
		Ticket ticket = new Ticket(100);
		SaleWin sw = new SaleWin(ticket);
		new Thread(sw,"窗口A").start();
		new Thread(sw,"窗口B").start();
		new Thread(sw,"窗口C").start();
	}
}


好的,这是一个比较具体的编程问题。可以使用Java语言来实现这个模拟售票系统,以下是示例代码: ```java public class TicketSeller implements Runnable { private int tickets = 100; // 总票 private static final int MAX_SELL = 5; // 最多连续售票 private static final int MIN_SELL = 1; // 最少售票 private int sellCount = 0; // 连续售票 @Override public void run() { while (tickets > 0) { synchronized (this) { // 加锁 if (sellCount >= MAX_SELL) { // 达到最大连续售票 try { wait(); // 休眠等待 } catch (InterruptedException e) { e.printStackTrace(); } } int sellNum = (int) (Math.random() * (MAX_SELL - MIN_SELL + 1)) + MIN_SELL; // 随机售票 if (sellNum > tickets) { // 剩余票足 sellNum = tickets; } tickets -= sellNum; // 更新余票 sellCount += sellNum; // 更新连续售票 System.out.println(Thread.currentThread().getName() + "售出" + sellNum + "张票,余票" + tickets + "张"); notifyAll(); // 唤醒等待的线程 } try { Thread.sleep((int) (Math.random() * 500)); // 随机休眠一段时间 } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 上述代码中,我们实现了Runnable接口并重写其run()方法。在run()方法中,我们使用synchronized关键字对共享资源,即剩余车票进行了加锁,保证了线程安全。在每个线程执行售票操作时,先判断是否已经连续售出了最大票,如果是则线程进入等待状态;否则,随机售出一定量的车票并更新剩余车票连续售票。最后,线程随机休眠一段时间,模拟售票过程。整个售票过程中,我们还使用了wait()和notifyAll()方法来进行线程的等待和唤醒,以保证线程之间的协作。 然后,我们在main()方法中启动多个线程来模拟多个售票窗口的情况: ```java public class Main { public static void main(String[] args) { TicketSeller ticketSeller = new TicketSeller(); Thread t1 = new Thread(ticketSeller, "窗口1"); Thread t2 = new Thread(ticketSeller, "窗口2"); Thread t3 = new Thread(ticketSeller, "窗口3"); Thread t4 = new Thread(ticketSeller, "窗口4"); t1.start(); t2.start(); t3.start(); t4.start(); } } ``` 上述代码中,我们创建了一个TicketSeller对象,并通过new Thread()方法创建了4个线程,分别模拟4个售票窗口。然后,我们通过调用线程的start()方法来启动线程,让它们开始执行售票操作。 这就是一个简单的模拟售票系统的实现方式,可以通过修改代码来适应更多的需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值