用java模拟三个窗口同时卖电影票的程序,电影票有第几排第几号两个参数,接受单张和联票(就是2-10张连续座位的票)两种订单。
时间: 2024-03-02 19:54:24 浏览: 180
以下是一个基于Java多线程的模拟三个窗口同时卖电影票的程序,支持单张和联票两种订单。
```java
import java.util.ArrayList;
import java.util.List;
public class TicketSeller {
private static final int ROWS = 10; // 电影院座位的行数
private static final int SEATS_PER_ROW = 10; // 电影院每行座位数
private static final int TOTAL_SEATS = ROWS * SEATS_PER_ROW; // 电影院总座位数
private static final int MAX_TICKETS_PER_ORDER = 10; // 最多能购买的票数
private static final int MIN_TICKETS_PER_ORDER = 1; // 最少能购买的票数
private static List<Integer> availableSeats = new ArrayList<>(); // 可用的座位
private static List<Integer> soldSeats = new ArrayList<>(); // 已售出的座位
static {
for (int i = 0; i < TOTAL_SEATS; i++) {
availableSeats.add(i + 1);
}
}
public synchronized static void sellTickets(String threadName) {
int ticketsPerOrder = (int) (Math.random() * (MAX_TICKETS_PER_ORDER - MIN_TICKETS_PER_ORDER + 1)) + MIN_TICKETS_PER_ORDER; // 随机生成购买的票数
List<Integer> seats = new ArrayList<>(); // 本次订单的座位
if (ticketsPerOrder == 1) { // 单张票
int seatIndex = (int) (Math.random() * availableSeats.size()); // 随机选择一个座位
int seat = availableSeats.get(seatIndex); // 获取座位号
availableSeats.remove(seatIndex); // 从可用座位中删除该座位
soldSeats.add(seat); // 将座位添加到已售出座位中
seats.add(seat); // 将座位添加到本次订单中
} else { // 联票
int startSeatIndex = (int) (Math.random() * (availableSeats.size() - ticketsPerOrder + 1)); // 随机选择联票的起始座位
for (int i = 0; i < ticketsPerOrder; i++) {
int seat = availableSeats.get(startSeatIndex + i); // 获取座位号
soldSeats.add(seat); // 将座位添加到已售出座位中
seats.add(seat); // 将座位添加到本次订单中
}
availableSeats.removeAll(seats); // 从可用座位中删除本次订单的所有座位
}
System.out.println(threadName + " sold " + ticketsPerOrder + " tickets. Seats: " + seats);
}
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
while (!availableSeats.isEmpty()) {
sellTickets(Thread.currentThread().getName());
try {
Thread.sleep(100); // 模拟售票过程需要的时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(() -> {
while (!availableSeats.isEmpty()) {
sellTickets(Thread.currentThread().getName());
try {
Thread.sleep(100); // 模拟售票过程需要的时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t3 = new Thread(() -> {
while (!availableSeats.isEmpty()) {
sellTickets(Thread.currentThread().getName());
try {
Thread.sleep(100); // 模拟售票过程需要的时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
t3.start();
}
}
```
这个程序使用了一个静态变量`availableSeats`来存储可用的座位,另一个静态变量`soldSeats`来存储已售出的座位。售票的方法`sellTickets`是一个同步方法,保证了在多线程环境下售票的安全性。在售票的过程中,随机生成购买的票数,根据票数生成单张票或联票,然后将座位从可用座位中删除,并将座位添加到已售出座位中。最后输出售票的结果。程序中的三个线程分别模拟了三个窗口同时售票的场景。
阅读全文