用Java编写:多线程模拟叫号系统
时间: 2024-02-16 09:05:11 浏览: 85
idea+java多线程模拟队列实现排队叫号.zip
5星 · 资源好评率100%
好的,下面是一个简单的多线程模拟叫号系统的Java代码:
```java
import java.util.LinkedList;
import java.util.Queue;
public class CallNumberSystem {
private static final int MAX_NUMBER = 100; // 最大号码
private static final int WINDOW_COUNT = 3; // 窗口数量
private static final int CUSTOMER_COUNT = 50; // 客户数量
private static Queue<Integer> queue = new LinkedList<>(); // 号码队列
public static void main(String[] args) {
// 初始化号码队列
for (int i = 1; i <= MAX_NUMBER; i++) {
queue.offer(i);
}
// 开启多个窗口
for (int i = 1; i <= WINDOW_COUNT; i++) {
new Thread(new Window(i)).start();
}
}
// 窗口类
private static class Window implements Runnable {
private int id; // 窗口编号
public Window(int id) {
this.id = id;
}
@Override
public void run() {
while (true) {
synchronized (queue) { // 同步队列
if (queue.isEmpty()) { // 队列为空,结束服务
break;
}
int number = queue.poll(); // 取出一个号码
System.out.printf("窗口%d号正在为第%d位客户办理业务\n", id, number);
try {
Thread.sleep((long) (Math.random() * 5000)); // 模拟办理业务的时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
```
以上代码中,我们创建了一个`CallNumberSystem`类来启动整个程序,其中定义了三个常量:`MAX_NUMBER`表示最大号码,`WINDOW_COUNT`表示窗口数量,`CUSTOMER_COUNT`表示客户数量。我们使用`LinkedList`作为队列来存储号码,然后在`main`方法中初始化队列,并启动多个窗口线程。每个窗口线程通过`synchronized`来同步访问队列,判断队列是否为空,如果不为空就取出一个号码,打印出当前窗口正在为第几位客户办理业务,并且模拟一段时间的办理业务时间,然后再次进入循环。当队列为空时,窗口线程结束服务。这样就实现了一个简单的多线程模拟叫号系统。
阅读全文