多线程模拟银行叫号系统
时间: 2023-07-24 13:12:54 浏览: 117
ServiceWaitPeople:Qt实现的叫号系统,模拟银行、医院的取号叫号系统
3星 · 编辑精心推荐
好的,这是您的第二个问题。下面是一个简单的多线程模拟银行叫号系统的示例代码:
首先,您需要创建一个Ticket类,用于表示每个顾客的票号和窗口号,如下所示:
```java
public class Ticket {
private int number;
private int window;
public Ticket(int number, int window) {
this.number = number;
this.window = window;
}
public int getNumber() {
return number;
}
public int getWindow() {
return window;
}
}
```
然后,您可以创建一个银行类Bank,用于模拟叫号系统,如下所示:
```java
import java.util.LinkedList;
import java.util.Queue;
public class Bank {
private int windowCount; // 窗口数量
private Queue<Integer> ticketQueue; // 顾客票号队列
private Ticket[] windows; // 窗口顾客票号数组
public Bank(int windowCount) {
this.windowCount = windowCount;
ticketQueue = new LinkedList<Integer>();
windows = new Ticket[windowCount];
}
public synchronized void takeTicket() {
int ticketNumber = ticketQueue.size() + 1;
ticketQueue.offer(ticketNumber);
System.out.println("顾客" + ticketNumber + "取号成功,当前排队人数:" + ticketQueue.size());
notifyAll();
}
public synchronized void callTicket(int windowNumber) {
while (true) {
if (ticketQueue.isEmpty()) {
System.out.println("窗口" + windowNumber + "等待顾客中...");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
int ticketNumber = ticketQueue.poll();
Ticket ticket = new Ticket(ticketNumber, windowNumber);
windows[windowNumber - 1] = ticket;
System.out.println("窗口" + windowNumber + "叫到了顾客" + ticketNumber + ",请前往" + windowNumber + "号窗口办理业务");
notifyAll();
break;
}
}
}
public synchronized void finishTicket(int windowNumber) {
Ticket ticket = windows[windowNumber - 1];
if (ticket != null) {
System.out.println("窗口" + windowNumber + "完成了顾客" + ticket.getNumber() + "的业务");
windows[windowNumber - 1] = null;
notifyAll();
}
}
}
```
Bank类的构造函数接收一个窗口数量,初始化一个顾客票号队列和一个窗口顾客票号数组。takeTicket()方法用于顾客取号,它首先为当前顾客生成一个顾客票号,然后将其加入到队列中,并输出当前排队人数。callTicket()方法用于窗口叫号,它首先检查队列是否为空,如果为空,则窗口等待;否则,窗口叫到了下一个顾客,并将其从队列中弹出,并将其票号和窗口号存储到窗口顾客票号数组中,并输出调用信息。finishTicket()方法用于窗口完成业务,它首先检查窗口是否有顾客,如果没有,则等待;否则,窗口完成了当前顾客的业务,并将窗口顾客票号数组中的该位置清空,并输出调用信息。
最后,您可以创建一个模拟程序,用于创建多个顾客线程和多个窗口线程,来模拟银行叫号系统,如下所示:
```java
public class BankSimulation {
public static void main(String[] args) {
Bank bank = new Bank(3);
// 创建多个顾客线程
for (int i = 1; i <= 10; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
bank.takeTicket();
}
});
thread.start();
}
// 创建多个窗口线程
for (int i = 1; i <= 3; i++) {
int windowNumber = i;
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
bank.callTicket(windowNumber);
try {
Thread.sleep(2000); // 模拟窗口处理业务的时间
} catch (InterruptedException e) {
e.printStackTrace();
}
bank.finishTicket(windowNumber);
}
}
});
thread.start();
}
}
}
```
上述代码将创建10个顾客线程和3个窗口线程,模拟银行叫号系统的运行过程。您可以根据自己的需要对其进行修改。希望能够帮到您,如果您有任何问题,请随时问我!
阅读全文