前言:该场景是模拟银行排队,其中窗口有3个,而且每个用户有不同的处理时间。
代码如下:
import java.util.LinkedList;
import java.util.Queue;
public class BankQueue {
private static final int WINDOW_NUM = 3; // 窗口数量
private static final int CUSTOMER_NUM = 10; // 客户数量
private static final int[] SERVICE_TIME = { 3, 5, 2, 4, 1, 6, 2, 4, 2, 3 }; // 不同客户的处理时间
public static void main(String[] args) {
Queue<Customer> queue = new LinkedList<>(); // 队列
for (int i = 0; i < CUSTOMER_NUM; i++) {
Customer customer = new Customer(i + 1, SERVICE_TIME[i]); // 创建客户
queue.offer(customer); // 将客户加入队列
}
int time = 0; // 当前时间
int[] window = new int[WINDOW_NUM]; // 窗口剩余处理时间
System.out.println("开始银行排队场景模拟:");
while (!queue.isEmpty() || isWindowBusy(window)) {
time++;
for (int i = 0; i < WINDOW_NUM; i++) {
if (window[i] == 0 && !queue.isEmpty()) { // 窗口空闲且队列不为空
Customer customer = queue.poll(); // 取出队首客户
System.out.println("第" + customer.getId() + "号客户开始在第" + (i + 1) + "号窗口处理业务,处理时间为" + customer.getServiceTime());
window[i] = customer.getServiceTime(); // 窗口开始处理客户业务
}
if (window[i] > 0) { // 窗口正在处理客户业务
window[i]--;
}
}
}
System.out.println("银行排队场景模拟结束,共用时" + time + "秒。");
}
private static boolean isWindowBusy(int[] window) {
for (int w : window) {
if (w > 0) {
return true;
}
}
return false;
}
static class Customer {
private int id; // 客户编号
private int serviceTime; // 客户需要处理的时间
public Customer(int id, int serviceTime) {
this.id = id;
this.serviceTime = serviceTime;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getServiceTime() {
return serviceTime;
}
public void setServiceTime(int serviceTime) {
this.serviceTime = serviceTime;
}
}
}
代码能够模拟银行排队场景,实现了以下功能:
创建多个不同处理时间的客户,并加入队列。
模拟多个窗口同时服务,按照队列顺序分配给空闲窗口,计算每个客户服务时间,返回全局最长时间(即所有客户都被服务完毕所需的时间)。
输出每个客户处理情况。
注意事项:本代码没有考虑客户是否能够等待的问题,即如果等候太久(超过自己的业务开展时间),应该退出队列,所以在实际场景中需要完善。