设计一个多线程程序如下:设计一个火车售票模拟程序。假如火车站要有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况 1、要求打印出每个售票点所卖出的票号 2、各售票点不能售出相同票号的火车票。用Java语言
时间: 2024-05-16 14:16:17 浏览: 104
以下是一个简单的 Java 多线程程序,用于模拟火车售票:
```java
import java.util.HashSet;
import java.util.Set;
public class TrainTicket {
private static int ticketNum = 100;
private static Set<Integer> soldTickets = new HashSet<>();
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread(new TicketSeller(i)).start();
}
}
static class TicketSeller implements Runnable {
private int sellerId;
public TicketSeller(int sellerId) {
this.sellerId = sellerId;
}
@Override
public void run() {
while (ticketNum > 0) {
synchronized (soldTickets) {
int ticketId = (int) (Math.random() * 100) + 1;
if (ticketNum > 0 && !soldTickets.contains(ticketId)) {
ticketNum--;
soldTickets.add(ticketId);
System.out.println("Seller " + sellerId + " sold ticket " + ticketId);
}
}
}
}
}
}
```
在这个程序中,我们使用了一个静态变量 `ticketNum` 来表示当前还有多少张票可以售出。同时,我们使用了一个 `soldTickets` 集合来记录已经售出的票号,以便在售票时判断当前票号是否已经售出。
在 `main` 方法中,我们创建了 5 个 `TicketSeller` 线程,并启动它们。
在 `TicketSeller` 类中,我们使用了一个 `while` 循环来模拟售票的过程,直到所有火车票都售完为止。在每次售票时,我们使用 `synchronized` 关键字来保证线程安全,以避免多个售票点同时售出相同的火车票。
这个程序还有一个小问题:如果火车票数量小于 5,那么可能会出现某些售票点永远无法售出票的情况。为了解决这个问题,我们可以将 `while` 循环中的条件改为 `ticketNum > 0 && soldTickets.size() < 100`,这样就可以确保所有售票点都能够售出火车票。
阅读全文