1.用JAVA实现一个由A、B、C三个窗口同时销售100张票的系统,要求打印出每个窗口打印的售票情况,并且每个窗口不得连续售票。...
时间: 2024-01-22 20:21:15 浏览: 58
可以使用Java的多线程编程来实现这个系统。具体实现步骤如下:
1. 定义一个Ticket类,用于表示一张票,包括票号和售票窗口号等属性。
```
public class Ticket {
private int ticketNo; // 票号
private String windowNo; // 售票窗口号
public Ticket(int ticketNo, String windowNo) {
this.ticketNo = ticketNo;
this.windowNo = windowNo;
}
public int getTicketNo() {
return ticketNo;
}
public void setTicketNo(int ticketNo) {
this.ticketNo = ticketNo;
}
public String getWindowNo() {
return windowNo;
}
public void setWindowNo(String windowNo) {
this.windowNo = windowNo;
}
}
```
2. 定义一个TicketSeller类,用于表示售票员,包括姓名和售票窗口号等属性。它还有一个sell方法,用于售票。
```
public class TicketSeller {
private String name; // 姓名
private String windowNo; // 售票窗口号
private boolean isSelling = false; // 是否正在售票
public TicketSeller(String name, String windowNo) {
this.name = name;
this.windowNo = windowNo;
}
public synchronized void sell(Ticket ticket) {
while (isSelling) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(name + "在" + windowNo + "售出了第" + ticket.getTicketNo() + "张票");
isSelling = true;
notifyAll();
}
public synchronized void done() {
isSelling = false;
notifyAll();
}
}
```
3. 定义一个TicketSystem类,用于表示售票系统。它包括多个售票员和一个票池。它的主要方法是sellTickets,用于开始售票。
```
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class TicketSystem {
private List<TicketSeller> ticketSellers = new ArrayList<>(); // 售票员列表
private List<Ticket> ticketPool = new ArrayList<>(); // 票池
private static final int TICKET_NUM = 100; // 票数
public TicketSystem() {
ticketSellers.add(new TicketSeller("A", "窗口1"));
ticketSellers.add(new TicketSeller("B", "窗口2"));
ticketSellers.add(new TicketSeller("C", "窗口3"));
for (int i = 1; i <= TICKET_NUM; i++) {
ticketPool.add(new Ticket(i, ""));
}
}
public void sellTickets() {
Random random = new Random();
int lastIndex = -1;
while (!ticketPool.isEmpty()) {
int index = random.nextInt(ticketSellers.size()); // 随机选择售票员
if (index != lastIndex) { // 连续售票的情况下不允许同一窗口售票
TicketSeller seller = ticketSellers.get(index);
if (!seller.isSelling && !ticketPool.isEmpty()) { // 如果售票员不忙且还有票
Ticket ticket = ticketPool.remove(0);
ticket.setWindowNo(seller.getWindowNo());
seller.sell(ticket);
lastIndex = index;
}
}
}
// 售票结束,通知所有售票员
for (TicketSeller seller : ticketSellers) {
seller.done();
}
}
public static void main(String[] args) {
TicketSystem system = new TicketSystem();
system.sellTickets();
}
}
```
4. 在main方法中创建一个TicketSystem对象,并调用sellTickets方法开始售票。每个售票员售票时会进入synchronized块,如果已经有其他售票员在售票,就会调用wait方法等待。当某个售票员售票完成后,会调用done方法通知其他售票员。
这样就完成了一个由A、B、C三个窗口同时销售100张票的系统,打印出每个窗口打印的售票情况,每个窗口不得连续售票。
阅读全文