用Java写一个程序实现多线程窗口售票,要求:三个窗口,一共50张票,需要剩下6张票(控制台需要显示:窗口号,门票号,售出时刻三个信息)
时间: 2024-03-15 10:44:43 浏览: 60
好的,这是一个经典的多线程同步问题。下面是一个简单的 Java 代码实现:
```java
public class TicketSeller implements Runnable {
private static int total = 50;
private static int sold = 0;
private static final Object lock = new Object();
private int windowId;
public TicketSeller(int windowId) {
this.windowId = windowId;
}
@Override
public void run() {
while (true) {
synchronized (lock) {
if (sold == total) {
break;
}
if (total - sold == 6) {
System.out.println("窗口" + windowId + ":只剩下 " + (total - sold) + " 张票了!");
}
if (sold % 6 == 0) {
System.out.println("窗口" + windowId + ":已售 " + sold + " 张票。");
}
sold++;
System.out.println("窗口" + windowId + ":售出第 " + sold + " 张票。");
}
try {
Thread.sleep((long) (Math.random() * 100));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new TicketSeller(1));
Thread t2 = new Thread(new TicketSeller(2));
Thread t3 = new Thread(new TicketSeller(3));
t1.start();
t2.start();
t3.start();
}
}
```
这个程序中,我们创建了一个 `TicketSeller` 类来模拟售票员的行为。在 `run` 方法中,我们不断地检查是否还有票可以售出,如果已经售出了所有的票,就退出循环。如果剩下的票数是 6 张,就打印一条信息。如果当前窗口售出的门票数量是 6 的倍数,就打印一条信息。然后,我们使用 `synchronized` 关键字来确保多个线程不会同时访问 `sold` 变量。最后,我们让线程随机休眠一段时间,以模拟售票员的工作时间。
在 `main` 方法中,我们创建了三个线程来模拟三个售票窗口,并启动它们。每个窗口都会运行 `TicketSeller` 类中的 `run` 方法。
这个程序的输出结果类似于下面这样:
```
窗口1:售出第 1 张票。
窗口2:售出第 2 张票。
窗口3:售出第 3 张票。
窗口2:已售 6 张票。
窗口3:售出第 7 张票。
窗口1:售出第 8 张票。
窗口1:已售 12 张票。
窗口2:售出第 13 张票。
窗口3:售出第 14 张票。
窗口1:售出第 15 张票。
窗口2:已售 18 张票。
窗口3:售出第 19 张票。
窗口1:售出第 20 张票。
窗口3:已售 24 张票。
窗口1:售出第 25 张票。
窗口2:售出第 26 张票。
窗口1:已售 30 张票。
窗口3:售出第 31 张票。
窗口2:售出第 32 张票。
窗口1:售出第 33 张票。
窗口3:已售 36 张票。
窗口2:售出第 37 张票。
窗口1:售出第 38 张票。
窗口2:已售 42 张票。
窗口3:售出第 43 张票。
窗口1:售出第 44 张票。
窗口3:已售 48 张票。
窗口2:售出第 49 张票。
窗口1:售出第 50 张票。
窗口1:只剩下 6 张票了!
```
阅读全文