使用java模拟三个窗口同时卖电影票的程序,电影票有第几排第几号两个参数,接受单张和联票(就是2-10张连续座位的票)两种订单。自行设计订单来验证你的程序的正确性。
时间: 2024-03-08 13:51:12 浏览: 15
好的,这是一个比较典型的多线程并发问题,可以使用Java中的线程和锁机制来实现。
首先,我们需要设计一个票务系统类,用于管理电影票的销售和查询。该类应该包含以下方法:
1. sellTicket(int row, int seat): 在指定的排和座位出售一张电影票。
2. sellTicket(int row, int startSeat, int endSeat): 在指定的排和起始座位到结束座位之间出售一张联票。
3. queryTicket(int row, int seat): 查询指定位置的电影票是否已售出。
然后,我们可以定义一个窗口类,用于模拟售票窗口。该类应该包含以下属性和方法:
1. id: 窗口的编号。
2. ticketSystem: 票务系统对象。
3. sellTicket(): 随机出售一张电影票或者联票。
4. run(): 窗口的主要业务逻辑,不断执行售票操作,直到所有票都售出。
最后,我们可以在主函数中创建三个窗口对象,并启动它们的线程,模拟三个窗口同时售票的过程。
以下是一个简单的实现:
```java
import java.util.*;
import java.util.concurrent.locks.*;
class TicketSystem {
private boolean[][] seats;
public TicketSystem(int rows, int seatsPerRow) {
seats = new boolean[rows][seatsPerRow];
}
public synchronized boolean sellTicket(int row, int seat) {
if (seats[row][seat]) {
return false; // 已经售出
} else {
seats[row][seat] = true;
return true; // 成功售出
}
}
public synchronized boolean sellTicket(int row, int startSeat, int endSeat) {
for (int i = startSeat; i <= endSeat; i++) {
if (seats[row][i]) {
return false; // 已经售出
}
}
for (int i = startSeat; i <= endSeat; i++) {
seats[row][i] = true;
}
return true; // 成功售出
}
public synchronized boolean queryTicket(int row, int seat) {
return seats[row][seat]; // true 表示已售出,false 表示未售出
}
}
class TicketWindow implements Runnable {
private int id;
private TicketSystem ticketSystem;
private Random random;
public TicketWindow(int id, TicketSystem ticketSystem) {
this.id = id;
this.ticketSystem = ticketSystem;
this.random = new Random();
}
private boolean sellSingleTicket() {
int row = random.nextInt(ticketSystem.seats.length);
int seat = random.nextInt(ticketSystem.seats[0].length);
return ticketSystem.sellTicket(row, seat);
}
private boolean sellGroupTicket() {
int row = random.nextInt(ticketSystem.seats.length);
int startSeat = random.nextInt(ticketSystem.seats[0].length - 10);
int endSeat = startSeat + 9;
return ticketSystem.sellTicket(row, startSeat, endSeat);
}
public void run() {
while (true) {
int choice = random.nextInt(2);
if (choice == 0) {
if (sellSingleTicket()) {
System.out.println("窗口 " + id + " 成功售出一张电影票。");
} else {
System.out.println("窗口 " + id + " 售出电影票失败,请重新尝试。");
}
} else {
if (sellGroupTicket()) {
System.out.println("窗口 " + id + " 成功售出一张连续的电影票。");
} else {
System.out.println("窗口 " + id + " 售出连续的电影票失败,请重新尝试。");
}
}
}
}
}
public class MovieTicket {
public static void main(String[] args) {
TicketSystem ticketSystem = new TicketSystem(10, 20);
TicketWindow[] windows = new TicketWindow[3];
for (int i = 0; i < windows.length; i++) {
windows[i] = new TicketWindow(i + 1, ticketSystem);
new Thread(windows[i]).start();
}
}
}
```
在上述代码中,我们使用了Java中的Lock机制来确保线程安全。在票务系统的三个方法中,我们使用了synchronized关键字来确保同一时刻只能有一个线程访问这些方法。在售票窗口的run方法中,我们使用了while(true)的无限循环来模拟窗口不断地售票,直到所有票都售出为止。
注意:上述代码仅仅是一个简单的示例,实际的电影票售票系统可能会更加复杂,需要考虑更多因素,如座位的价格、退票、改签等等。