Java编写程序实现多线程售卖火车票,要求如下:(1)假设售票厅有四个窗口可发售某日某次列车的100张车票。 (2)出售的火车票不能出现重复的票号、大于100的票、小于0的票。 (3)在控制台中打印每个窗口对应售出的票
时间: 2023-11-27 17:52:05 浏览: 90
以下是 Java 编写程序实现多线程售卖火车票的代码:
```java
public class TrainTicketSales {
private static int ticketCount = 100; // 总票数
private static int soldCount = 0; // 已售出的票数
private static Object lock = new Object(); // 锁对象
public static void main(String[] args) {
for (int i = 1; i <= 4; i++) { // 创建 4 个窗口线程
new Thread(new TicketSeller(i)).start();
}
}
private static class TicketSeller implements Runnable {
private int windowNum; // 窗口编号
public TicketSeller(int windowNum) {
this.windowNum = windowNum;
}
@Override
public void run() {
while (true) {
synchronized (lock) { // 加锁
if (ticketCount == 0) { // 判断是否售完
System.out.println("窗口" + windowNum + "已售完所有车票!");
break;
}
int ticketNo = (int) (Math.random() * 100) + 1; // 随机生成车票号码
if (ticketNo > 100 || ticketNo < 1 || soldCount + 1 > 100) { // 判断车票是否合法
continue;
}
System.out.println("窗口" + windowNum + "售出了第" + ticketNo + "号车票。");
ticketCount--; // 减少总票数
soldCount++; // 增加已售出的票数
}
try {
Thread.sleep(100); // 模拟售票时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
```
以上代码中,使用了一个静态的共享变量 `ticketCount` 存储总票数,使用了 `soldCount` 存储已售出的票数。为了保证线程安全,使用了一个静态的锁对象 `lock`。每个窗口线程从总票数中随机生成一张车票号码,判断该号码是否合法,如果合法则打印出售信息,并且减少总票数和增加已售出的票数。如果总票数为 0,即售完所有车票,则结束线程。最后,使用 `Thread.sleep()` 模拟售票时间。
阅读全文