------- android培训、java培训、期待与您交流! ----------
题目:银行业务调度系统
模拟实现银行业务调度系统逻辑,具体需求如下:
Ø 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
Ø 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
Ø 异步随机生成各种类型的客户,生成各类型用户的概率比例为:
VIP客户 :普通客户 :快速客户 = 1 :6 :3。
Ø 客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
Ø 各类型客户在其对应窗口按顺序依次办理业务。
Ø 当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
Ø 随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
Ø 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
代码模拟实现:
package along.study.bank;
import java.util.ArrayList;
import java.util.List;
//序列号生成器,根据用户进入银行的顺序,生成相应的序列号并保存到一个
//集合中,当工作人员叫号时,号码生成器将会从集合中的最开始取出一个
//序列号,并删除该号码,然后将该号码返回
public class NumberGenerator {
private int latestNumber = 1;
private List<Integer> queueNumber = new ArrayList<Integer>();
public synchronized int generateNewNumber() {
queueNumber.add(latestNumber);
return latestNumber++;
}
public synchronized Integer getFirstNumber() {
if(queueNumber.size() > 0)
return queueNumber.remove(0);
return null;
}
}
package along.study.bank;
//序列号生成器管理类。采用单例模式设计。在初始化的时候会声明三个序列号
//生成器,分别用来生成普通用户序列号、快速用户序列号、VIP用户序列号
//不同的服务窗口会调用此类不同的方法,以返回与其对应的序列号生成器
public class NumberGeneratorManager {
private static NumberGeneratorManager numberGeneratorManager = new NumberGeneratorManager();
private NumberGeneratorManager() {
}
public static NumberGeneratorManager getInstance() {
return numberGeneratorManager;
}
private NumberGenerator commonGenerator = new NumberGenerator();
private NumberGenerator expressGenerator = new NumberGenerator();
private NumberGenerator VIPGenerator = new NumberGenerator();
public NumberGenerator getCommonGenerator() {
return commonGenerator;
}
public NumberGenerator getExpressGenerator() {
return expressGenerator;
}
public NumberGenerator getVIPGenerator() {
return VIPGenerator;
}
}
package along.study.bank;
import java.util.Random;
import java.util.concurrent.Executors;
//通用服务窗口模拟类
public class GeneralServiceWindow {
private int windowId = 0;
private WindowType windowType = WindowType.General;
private String cutomerType = Consts.GENERAL_CUSTOMER;
public void setWindowType(WindowType windowType) {
this.windowType = windowType;
}
public void setWindowId(int windowId) {
this.windowId = windowId;
}
//最重要的方法,担负着主动叫号、为“用户”“服务”的功能
public void service() {
Executors.newSingleThreadExecutor().execute(new Runnable() {
NumberGenerator generator = getGenerator();
@Override
public void run() {
while (true) {
System.out.println(serviceTypeNumber()
+ " 开始尝试向 当前服务窗口 获取新任务");
Integer customerNumber = generator.getFirstNumber();
if (customerNumber != null) {
System.out.println(serviceTypeNumber() + " 服务 ---> "
+ customerNumber + "号" + getCutomerType()
+ " 服务 ");
long beginTime = System.currentTimeMillis();
try {
Thread.sleep(getServiceTime());
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime = System.currentTimeMillis() - beginTime;
System.out.println(serviceTypeNumber() + " 为 "
+ customerNumber + "号" + getCutomerType()
+ " 服务>>>>>完毕,耗时 " + (costTime / 1000)
+ " 秒");
} else {
doOthers();
}
}
}
});
}
public long getServiceTime() {
return new Random().nextInt(10) * 1000
+ Consts.MIN_SERVICE_TIME;
}
public void doOthers() {
System.out.println(serviceTypeNumber() + " 在 当前窗口 未找到新任务,将休息1秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public NumberGenerator getGenerator() {
return NumberGeneratorManager.getInstance().getCommonGenerator();
}
public String getCutomerType() {
return cutomerType;
}
public void setCutomerType(String cutomerType) {
this.cutomerType = cutomerType;
}
//专供子类调用的方法
final public void subDoOthers() {
System.out.println(serviceTypeNumber() + " 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务");
NumberGenerator generator = NumberGeneratorManager.getInstance().getCommonGenerator();
Integer customerNumber = generator.getFirstNumber();
if (customerNumber != null) {
System.out.println(serviceTypeNumber() + " 在普通窗口找到新任务,开始服务 ---> "
+ customerNumber + "号" + cutomerType);
long beginTime = System.currentTimeMillis();
long serviceTime = new Random().nextInt(10) * 1000
+ Consts.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime = System.currentTimeMillis() - beginTime;
System.out.println(serviceTypeNumber() + " 完成额外工作!!为 " + customerNumber
+ "号" + cutomerType + " 服务>>>>>完毕,耗时 "
+ (costTime / 1000) + " 秒");
} else {
System.out.println(serviceTypeNumber() + " 在 普通窗口 未找到新任务,将休息1秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public String serviceTypeNumber() {
return windowType.toString() + windowId;
}
}
package along.study.bank;
//快速服务窗口模拟类
public class ExpressServiceWindow extends GeneralServiceWindow {
private int windowId = 0;
private WindowType windowType = WindowType.Express;
private String cutomerType = Consts.EXPRESS_CUSTOMER;
@Override
public long getServiceTime() {
return 2000;
}
@Override
public void doOthers() {
super.subDoOthers();
}
@Override
public NumberGenerator getGenerator() {
return NumberGeneratorManager.getInstance().getExpressGenerator();
}
@Override
public void setWindowType(WindowType windowType) {
this.windowType = windowType;
}
@Override
public String getCutomerType() {
return cutomerType;
}
@Override
public void setCutomerType(String cutomerType) {
this.cutomerType = cutomerType;
}
@Override
public void setWindowId(int windowId) {
this.windowId = windowId;
}
@Override
public String serviceTypeNumber() {
return windowType.toString() + windowId;
}
}
package along.study.bank;
//VIP服务窗口模拟类
public class VIPServiceWindow extends GeneralServiceWindow {
private int windowId = 0;
private WindowType windowType = WindowType.VIP;
private String cutomerType = Consts.VIP_CUSTOMER;
@Override
public void doOthers() {
subDoOthers();
}
@Override
public NumberGenerator getGenerator() {
return NumberGeneratorManager.getInstance().getVIPGenerator();
}
@Override
public void setWindowType(WindowType windowType) {
this.windowType = windowType;
}
public String getCutomerType() {
return cutomerType;
}
public void setCutomerType(String cutomerType) {
this.cutomerType = cutomerType;
}
@Override
public void setWindowId(int windowId) {
this.windowId = windowId;
}
@Override
public String serviceTypeNumber() {
return windowType.toString() + windowId;
}
}
package along.study.bank;
//一些常用的常量
public interface Consts {
public static final long MAX_SERVICE_TIME = 10000;//窗口的最大服务时间
public static final long MIN_SERVICE_TIME = 1000;//窗口的最小服务时间
public static final String GENERAL_CUSTOMER = "普通用户";//普通用户标志
public static final String EXPRESS_CUSTOMER = "快速用户";//快速用户标识
public static final String VIP_CUSTOMER = "VIP用户";//VIP用户标识
public static final byte BASE_RATE_OF_GENERATE_CUSTOMER = 1;//模拟生成用户时的生成频率
}
package along.study.bank;
//代表三种不同的服务窗口
public enum WindowType {
General,Express,VIP;
public String toString() {
switch (this) {
case General:
return "普通窗口";
case Express:
return "快速窗口";
case VIP:
return "VIP窗口";
}
return null;
};
}
package along.study.bank;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
//测试类,模拟生成用户和服务窗口,并启动相应的工作方法
public class TestClass {
@Test
public void test1(){
GeneralServiceWindow window = new GeneralServiceWindow();
window.service();
}
public static void main(String[] args) {
//模拟生成4个普通服务窗口
for(int i = 1;i < 5;i++){
GeneralServiceWindow window = new GeneralServiceWindow();
window.setWindowId(i);
window.setWindowType(WindowType.General);
window.service();
}
//模拟生成2个快速服务窗口
for(int i = 1;i < 5;i++){
GeneralServiceWindow window = new ExpressServiceWindow();
window.setWindowId(i);
window.setWindowType(WindowType.Express);
window.service();
}
//模拟生成1个VIP服务窗口
GeneralServiceWindow window = new VIPServiceWindow();
window.setWindowId(1);
window.setWindowType(WindowType.VIP);
window.service();
Executors.newScheduledThreadPool(1)
.scheduleAtFixedRate(new Runnable() {
int i = 0;
@Override
public void run() {
i++;
System.out.println("模拟生成生成普通用户 " + i);
NumberGeneratorManager.getInstance()
.getCommonGenerator().generateNewNumber();
}
},
0,
Consts.BASE_RATE_OF_GENERATE_CUSTOMER,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1)
.scheduleAtFixedRate(new Runnable() {
int i = 0;
@Override
public void run() {
i++;
System.out.println("模拟生成生成快速用户 " + i);
NumberGeneratorManager.getInstance()
.getExpressGenerator().generateNewNumber();
}
},
0,
Consts.BASE_RATE_OF_GENERATE_CUSTOMER * 2,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1)
.scheduleAtFixedRate(new Runnable() {
int i = 0;
@Override
public void run() {
i++;
System.out.println("模拟生成生成VIP用户 " + i);
NumberGeneratorManager.getInstance()
.getVIPGenerator().generateNewNumber();
}
},
0,
Consts.BASE_RATE_OF_GENERATE_CUSTOMER * 6,
TimeUnit.SECONDS);
}
}
试题答案是根据张孝祥老师的《银行业务调度系统》视频讲解整理而成,稍有不同的是张老师的三种服务窗口都采用了同一个类,我根据张老师的讲解后将另外两种服务窗口继承了通用服务窗口类,提高了代码的重用性。但是,在某些情况下Java的多态性并不能像我们希望的那样工作,因此在通用服务窗口类中增加了一个final方法,专门供子类调用,用以实现子类在当前窗口找不到任务的情况下去父类窗口查找的功能
下面是运行一段时间后的输出结果:
普通窗口1 开始尝试向 当前服务窗口 获取新任务
普通窗口1 在 当前窗口 未找到新任务,将休息1秒
普通窗口4 开始尝试向 当前服务窗口 获取新任务
普通窗口4 在 当前窗口 未找到新任务,将休息1秒
快速窗口1 开始尝试向 当前服务窗口 获取新任务
快速窗口1 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口1 在 普通窗口 未找到新任务,将休息1秒
普通窗口2 开始尝试向 当前服务窗口 获取新任务
普通窗口2 在 当前窗口 未找到新任务,将休息1秒
普通窗口3 开始尝试向 当前服务窗口 获取新任务
普通窗口3 在 当前窗口 未找到新任务,将休息1秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口2 在 普通窗口 未找到新任务,将休息1秒
快速窗口3 开始尝试向 当前服务窗口 获取新任务
快速窗口3 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口3 在 普通窗口 未找到新任务,将休息1秒
快速窗口4 开始尝试向 当前服务窗口 获取新任务
VIP窗口1 开始尝试向 当前服务窗口 获取新任务
VIP窗口1 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
VIP窗口1 在 普通窗口 未找到新任务,将休息1秒
快速窗口4 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口4 在 普通窗口 未找到新任务,将休息1秒
模拟生成生成普通用户 1
模拟生成生成VIP用户 1
模拟生成生成快速用户 1
普通窗口1 开始尝试向 当前服务窗口 获取新任务
普通窗口4 开始尝试向 当前服务窗口 获取新任务
普通窗口4 在 当前窗口 未找到新任务,将休息1秒
普通窗口1 服务 ---> 1号普通用户 服务
普通窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口1 开始尝试向 当前服务窗口 获取新任务
普通窗口2 在 当前窗口 未找到新任务,将休息1秒
快速窗口1 服务 ---> 1号快速用户 服务
VIP窗口1 开始尝试向 当前服务窗口 获取新任务
VIP窗口1 服务 ---> 1号VIP用户 服务
普通窗口3 开始尝试向 当前服务窗口 获取新任务
普通窗口3 在 当前窗口 未找到新任务,将休息1秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口2 在 普通窗口 未找到新任务,将休息1秒
快速窗口3 开始尝试向 当前服务窗口 获取新任务
快速窗口3 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口3 在 普通窗口 未找到新任务,将休息1秒
快速窗口4 开始尝试向 当前服务窗口 获取新任务
快速窗口4 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口4 在 普通窗口 未找到新任务,将休息1秒
模拟生成生成普通用户 2
普通窗口4 开始尝试向 当前服务窗口 获取新任务
普通窗口4 服务 ---> 2号普通用户 服务
普通窗口2 开始尝试向 当前服务窗口 获取新任务
普通窗口2 在 当前窗口 未找到新任务,将休息1秒
模拟生成生成普通用户 3
普通窗口3 开始尝试向 当前服务窗口 获取新任务
普通窗口3 在 当前窗口 未找到新任务,将休息1秒
模拟生成生成快速用户 2
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 2号快速用户 服务
快速窗口3 开始尝试向 当前服务窗口 获取新任务
快速窗口4 开始尝试向 当前服务窗口 获取新任务
快速窗口3 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口4 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口3 在普通窗口找到新任务,开始服务 ---> 3号普通用户
快速窗口4 在 普通窗口 未找到新任务,将休息1秒
普通窗口4 为 2号普通用户 服务>>>>>完毕,耗时 1 秒
普通窗口4 开始尝试向 当前服务窗口 获取新任务
普通窗口4 在 当前窗口 未找到新任务,将休息1秒
快速窗口1 为 1号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口1 开始尝试向 当前服务窗口 获取新任务
快速窗口1 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口1 在 普通窗口 未找到新任务,将休息1秒
普通窗口2 开始尝试向 当前服务窗口 获取新任务
普通窗口2 在 当前窗口 未找到新任务,将休息1秒
普通窗口3 开始尝试向 当前服务窗口 获取新任务
模拟生成生成普通用户 4
普通窗口3 在 当前窗口 未找到新任务,将休息1秒
快速窗口4 开始尝试向 当前服务窗口 获取新任务
快速窗口4 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口4 在普通窗口找到新任务,开始服务 ---> 4号普通用户
普通窗口4 开始尝试向 当前服务窗口 获取新任务
普通窗口4 在 当前窗口 未找到新任务,将休息1秒
快速窗口1 开始尝试向 当前服务窗口 获取新任务
快速窗口1 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口1 在 普通窗口 未找到新任务,将休息1秒
普通窗口2 开始尝试向 当前服务窗口 获取新任务
普通窗口2 在 当前窗口 未找到新任务,将休息1秒
模拟生成生成普通用户 5
普通窗口3 开始尝试向 当前服务窗口 获取新任务
普通窗口3 服务 ---> 5号普通用户 服务
模拟生成生成快速用户 3
快速窗口2 为 2号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 3号快速用户 服务
普通窗口4 开始尝试向 当前服务窗口 获取新任务
普通窗口4 在 当前窗口 未找到新任务,将休息1秒
普通窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口1 开始尝试向 当前服务窗口 获取新任务
普通窗口2 在 当前窗口 未找到新任务,将休息1秒
快速窗口1 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口1 在 普通窗口 未找到新任务,将休息1秒
模拟生成生成普通用户 6
普通窗口4 开始尝试向 当前服务窗口 获取新任务
普通窗口4 服务 ---> 6号普通用户 服务
快速窗口1 开始尝试向 当前服务窗口 获取新任务
快速窗口1 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口1 在 普通窗口 未找到新任务,将休息1秒
普通窗口2 开始尝试向 当前服务窗口 获取新任务
普通窗口2 在 当前窗口 未找到新任务,将休息1秒
模拟生成生成普通用户 7
模拟生成生成快速用户 4
模拟生成生成VIP用户 2
快速窗口2 为 3号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 4号快速用户 服务
快速窗口1 开始尝试向 当前服务窗口 获取新任务
普通窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口1 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
普通窗口2 服务 ---> 7号普通用户 服务
快速窗口1 在 普通窗口 未找到新任务,将休息1秒
模拟生成生成普通用户 8
快速窗口1 开始尝试向 当前服务窗口 获取新任务
快速窗口1 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口1 在普通窗口找到新任务,开始服务 ---> 8号普通用户
模拟生成生成普通用户 9
模拟生成生成快速用户 5
快速窗口2 为 4号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 5号快速用户 服务
模拟生成生成普通用户 10
VIP窗口1 为 1号VIP用户 服务>>>>>完毕,耗时 9 秒
VIP窗口1 开始尝试向 当前服务窗口 获取新任务
VIP窗口1 服务 ---> 2号VIP用户 服务
模拟生成生成普通用户 11
模拟生成生成快速用户 6
快速窗口2 为 5号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 6号快速用户 服务
快速窗口3 完成额外工作!!为 3号普通用户 服务>>>>>完毕,耗时 8 秒
快速窗口3 开始尝试向 当前服务窗口 获取新任务
快速窗口3 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口3 在普通窗口找到新任务,开始服务 ---> 9号普通用户
普通窗口1 为 1号普通用户 服务>>>>>完毕,耗时 10 秒
普通窗口1 开始尝试向 当前服务窗口 获取新任务
普通窗口1 服务 ---> 10号普通用户 服务
模拟生成生成普通用户 12
模拟生成生成普通用户 13
模拟生成生成快速用户 7
模拟生成生成VIP用户 3
快速窗口2 为 6号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 7号快速用户 服务
快速窗口1 完成额外工作!!为 8号普通用户 服务>>>>>完毕,耗时 5 秒
快速窗口1 开始尝试向 当前服务窗口 获取新任务
快速窗口1 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口1 在普通窗口找到新任务,开始服务 ---> 11号普通用户
模拟生成生成普通用户 14
快速窗口4 完成额外工作!!为 4号普通用户 服务>>>>>完毕,耗时 10 秒
快速窗口4 开始尝试向 当前服务窗口 获取新任务
快速窗口4 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口4 在普通窗口找到新任务,开始服务 ---> 12号普通用户
模拟生成生成普通用户 15
普通窗口3 为 5号普通用户 服务>>>>>完毕,耗时 10 秒
普通窗口3 开始尝试向 当前服务窗口 获取新任务
普通窗口3 服务 ---> 13号普通用户 服务
模拟生成生成快速用户 8
快速窗口2 为 7号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 8号快速用户 服务
模拟生成生成普通用户 16
快速窗口4 完成额外工作!!为 12号普通用户 服务>>>>>完毕,耗时 2 秒
快速窗口4 开始尝试向 当前服务窗口 获取新任务
快速窗口4 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口4 在普通窗口找到新任务,开始服务 ---> 14号普通用户
普通窗口4 为 6号普通用户 服务>>>>>完毕,耗时 10 秒
普通窗口4 开始尝试向 当前服务窗口 获取新任务
普通窗口4 服务 ---> 15号普通用户 服务
普通窗口2 为 7号普通用户 服务>>>>>完毕,耗时 9 秒
普通窗口2 开始尝试向 当前服务窗口 获取新任务
普通窗口2 服务 ---> 16号普通用户 服务
模拟生成生成普通用户 17
模拟生成生成快速用户 9
快速窗口2 为 8号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 9号快速用户 服务
模拟生成生成普通用户 18
普通窗口3 为 13号普通用户 服务>>>>>完毕,耗时 3 秒
普通窗口3 开始尝试向 当前服务窗口 获取新任务
普通窗口3 服务 ---> 17号普通用户 服务
模拟生成生成普通用户 19
模拟生成生成VIP用户 4
模拟生成生成快速用户 10
快速窗口2 为 9号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 10号快速用户 服务
快速窗口3 完成额外工作!!为 9号普通用户 服务>>>>>完毕,耗时 8 秒
快速窗口3 开始尝试向 当前服务窗口 获取新任务
快速窗口3 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口3 在普通窗口找到新任务,开始服务 ---> 18号普通用户
VIP窗口1 为 2号VIP用户 服务>>>>>完毕,耗时 9 秒
VIP窗口1 开始尝试向 当前服务窗口 获取新任务
VIP窗口1 服务 ---> 3号VIP用户 服务
模拟生成生成普通用户 20
普通窗口4 为 15号普通用户 服务>>>>>完毕,耗时 4 秒
普通窗口4 开始尝试向 当前服务窗口 获取新任务
普通窗口4 服务 ---> 19号普通用户 服务
模拟生成生成普通用户 21
模拟生成生成快速用户 11
快速窗口2 为 10号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 11号快速用户 服务
普通窗口1 为 10号普通用户 服务>>>>>完毕,耗时 10 秒
普通窗口1 开始尝试向 当前服务窗口 获取新任务
普通窗口1 服务 ---> 20号普通用户 服务
VIP窗口1 为 3号VIP用户 服务>>>>>完毕,耗时 2 秒
VIP窗口1 开始尝试向 当前服务窗口 获取新任务
VIP窗口1 服务 ---> 4号VIP用户 服务
模拟生成生成普通用户 22
快速窗口4 完成额外工作!!为 14号普通用户 服务>>>>>完毕,耗时 6 秒
快速窗口4 开始尝试向 当前服务窗口 获取新任务
快速窗口4 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口4 在普通窗口找到新任务,开始服务 ---> 21号普通用户
普通窗口2 为 16号普通用户 服务>>>>>完毕,耗时 6 秒
普通窗口2 开始尝试向 当前服务窗口 获取新任务
普通窗口2 服务 ---> 22号普通用户 服务
模拟生成生成普通用户 23
模拟生成生成快速用户 12
快速窗口2 为 11号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 12号快速用户 服务
快速窗口1 完成额外工作!!为 11号普通用户 服务>>>>>完毕,耗时 10 秒
快速窗口1 开始尝试向 当前服务窗口 获取新任务
快速窗口1 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口1 在普通窗口找到新任务,开始服务 ---> 23号普通用户
模拟生成生成普通用户 24
快速窗口4 完成额外工作!!为 21号普通用户 服务>>>>>完毕,耗时 2 秒
快速窗口4 开始尝试向 当前服务窗口 获取新任务
快速窗口4 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口4 在普通窗口找到新任务,开始服务 ---> 24号普通用户
模拟生成生成普通用户 25
普通窗口3 为 17号普通用户 服务>>>>>完毕,耗时 7 秒
普通窗口3 开始尝试向 当前服务窗口 获取新任务
普通窗口3 在 当前窗口 未找到新任务,将休息1秒
模拟生成生成快速用户 13
模拟生成生成VIP用户 5
快速窗口2 为 12号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 13号快速用户 服务
快速窗口1 完成额外工作!!为 23号普通用户 服务>>>>>完毕,耗时 2 秒
快速窗口1 开始尝试向 当前服务窗口 获取新任务
快速窗口1 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口1 在普通窗口找到新任务,开始服务 ---> 25号普通用户
普通窗口3 开始尝试向 当前服务窗口 获取新任务
模拟生成生成普通用户 26
普通窗口3 在 当前窗口 未找到新任务,将休息1秒
快速窗口3 完成额外工作!!为 18号普通用户 服务>>>>>完毕,耗时 7 秒
快速窗口3 开始尝试向 当前服务窗口 获取新任务
快速窗口3 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口3 在普通窗口找到新任务,开始服务 ---> 26号普通用户
模拟生成生成普通用户 27
普通窗口3 开始尝试向 当前服务窗口 获取新任务
普通窗口3 服务 ---> 27号普通用户 服务
模拟生成生成快速用户 14
快速窗口2 为 13号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 14号快速用户 服务
普通窗口4 为 19号普通用户 服务>>>>>完毕,耗时 7 秒
普通窗口1 为 20号普通用户 服务>>>>>完毕,耗时 6 秒
普通窗口4 开始尝试向 当前服务窗口 获取新任务
普通窗口1 开始尝试向 当前服务窗口 获取新任务
普通窗口4 在 当前窗口 未找到新任务,将休息1秒
普通窗口1 在 当前窗口 未找到新任务,将休息1秒
模拟生成生成普通用户 28
普通窗口4 开始尝试向 当前服务窗口 获取新任务
普通窗口1 开始尝试向 当前服务窗口 获取新任务
普通窗口1 服务 ---> 28号普通用户 服务
普通窗口4 在 当前窗口 未找到新任务,将休息1秒
VIP窗口1 为 4号VIP用户 服务>>>>>完毕,耗时 7 秒
VIP窗口1 开始尝试向 当前服务窗口 获取新任务
VIP窗口1 服务 ---> 5号VIP用户 服务
模拟生成生成普通用户 29
模拟生成生成快速用户 15
快速窗口2 为 14号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 15号快速用户 服务
普通窗口4 开始尝试向 当前服务窗口 获取新任务
普通窗口4 服务 ---> 29号普通用户 服务
模拟生成生成普通用户 30
普通窗口2 为 22号普通用户 服务>>>>>完毕,耗时 8 秒
普通窗口2 开始尝试向 当前服务窗口 获取新任务
普通窗口2 服务 ---> 30号普通用户 服务
模拟生成生成普通用户 31
模拟生成生成快速用户 16
模拟生成生成VIP用户 6
快速窗口2 为 15号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 16号快速用户 服务
模拟生成生成普通用户 32
快速窗口4 完成额外工作!!为 24号普通用户 服务>>>>>完毕,耗时 8 秒
快速窗口4 开始尝试向 当前服务窗口 获取新任务
快速窗口4 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口4 在普通窗口找到新任务,开始服务 ---> 31号普通用户
模拟生成生成普通用户 33
普通窗口3 为 27号普通用户 服务>>>>>完毕,耗时 6 秒
普通窗口3 开始尝试向 当前服务窗口 获取新任务
普通窗口3 服务 ---> 32号普通用户 服务
模拟生成生成快速用户 17
快速窗口2 为 16号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 17号快速用户 服务
快速窗口4 完成额外工作!!为 31号普通用户 服务>>>>>完毕,耗时 1 秒
快速窗口4 开始尝试向 当前服务窗口 获取新任务
快速窗口4 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口4 在普通窗口找到新任务,开始服务 ---> 33号普通用户
普通窗口1 为 28号普通用户 服务>>>>>完毕,耗时 5 秒
普通窗口1 开始尝试向 当前服务窗口 获取新任务
普通窗口1 在 当前窗口 未找到新任务,将休息1秒
模拟生成生成普通用户 34
普通窗口1 开始尝试向 当前服务窗口 获取新任务
普通窗口1 服务 ---> 34号普通用户 服务
快速窗口1 完成额外工作!!为 25号普通用户 服务>>>>>完毕,耗时 9 秒
快速窗口1 开始尝试向 当前服务窗口 获取新任务
快速窗口1 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口1 在 普通窗口 未找到新任务,将休息1秒
模拟生成生成普通用户 35
模拟生成生成快速用户 18
快速窗口2 为 17号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 18号快速用户 服务
快速窗口1 开始尝试向 当前服务窗口 获取新任务
快速窗口1 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口1 在普通窗口找到新任务,开始服务 ---> 35号普通用户
模拟生成生成普通用户 36
快速窗口3 完成额外工作!!为 26号普通用户 服务>>>>>完毕,耗时 10 秒
快速窗口3 开始尝试向 当前服务窗口 获取新任务
快速窗口3 未能在当前窗口获取新任务,开始尝试向 普通服务窗口 获取新任务
快速窗口3 在普通窗口找到新任务,开始服务 ---> 36号普通用户
模拟生成生成普通用户 37
模拟生成生成快速用户 19
模拟生成生成VIP用户 7
快速窗口2 为 18号快速用户 服务>>>>>完毕,耗时 2 秒
快速窗口2 开始尝试向 当前服务窗口 获取新任务
快速窗口2 服务 ---> 19号快速用户 服务
普通窗口4 为 29号普通用户 服务>>>>>完毕,耗时 8 秒
普通窗口4 开始尝试向 当前服务窗口 获取新任务
普通窗口4 服务 ---> 37号普通用户 服务
模拟生成生成普通用户 38