(1)编程模拟售票系统,模拟多个窗口(至少4个)同时出售100张车票的情况;用实现Runnable接口的方法实现多线程。
时间: 2024-01-13 08:03:18 浏览: 56
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口(csdn)————程.pdf
好的,这是一个比较具体的编程问题。可以使用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()方法来启动线程,让它们开始执行售票操作。
这就是一个简单的模拟售票系统的实现方式,可以通过修改代码来适应更多的需求。
阅读全文