模拟实现银行业务调度系统逻辑,具体需求如下:
银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
异步随机生成各种类型的客户,生成各类型用户的概率比例为: VIP客户 :普通客户 :快速客户 = 1 :6 :3。
客户办理业务所需时间有最大值和最小值
在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
各类型客户在其对应窗口按顺序依次办理业务。
当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,
而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。 随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
需求分析:
每个服务窗口都是一个独立运行的对象,因此要创建6个服务窗口线程:ServerWindow()
每个窗口都有两种状态:正常服务状态,空闲状态,普通窗口空闲状态无定义,快速窗口和VIP窗口空闲状态可以服务普通客户;ServerOnNormal(),ServerOnFree()
每个窗口的每种状态对应一个客户队列,普通窗口两种状态对应同一个客户队列,快速窗口和VIP窗口空闲状态对应普通用户队列;
每个用户队列应该能随机生成各自的用户,生成速率由speed变量控制,普通用户速率为6个/10秒,快速用户的速率为3个/10秒,VIP客户的速率为1个/10秒
每个用户都有其需要服务的时间,因此用户对象中应该保存其需要服务的时间,需要服务时间在初始化用户对象时随机赋予;
以下是具体实现代码:
public class BankDemo {
public static void main(String[] args) {
PersonList VIP = new PersonList("VIP");//VIP窗口队列
PersonList NORMAL = new PersonList("NORMAL");//普通窗口队列
PersonList QUICKLY = new PersonList("QUICKLY");//快速窗口队列
VIP.start();//启动VIP窗口队列进程
NORMAL.start();//启动普通窗口队列进程
QUICKLY.start();//启动快速窗口队列进程
new ServerWindow("普通服务窗口1", NORMAL, NORMAL).start();//创建并启动普通窗口1
new ServerWindow("普通服务窗口2", NORMAL, NORMAL).start();//创建并启动普通窗口2
new ServerWindow("普通服务窗口3", NORMAL, NORMAL).start();//创建并启动普通窗口3
new ServerWindow("普通服务窗口4", NORMAL, NORMAL).start();//创建并启动普通窗口4
new ServerWindow("VIP服务窗口", VIP, NORMAL).start();//创建并启动VIP窗口
new ServerWindow("快速服务窗口", QUICKLY, NORMAL).start();//创建并启动快速窗口
}
}
class PersonList extends Thread {/* 为了更有表现性,这里将客户办理业务的最大时间设置成小于客户生成时间, */
private LinkedList<Person> personlist = new LinkedList<Person>();//排队办理业务的用户队列
private Random random = new Random();//随机数生成器
private String type;// 客户类型
private int speed;// 生成客户的速度
private int personNum = 0;// 客户计数器
//private final static int maxTime = 5;// 客户办理业务最大时间
private final static int minTime = 1;// 客户办理业务最小时间
public PersonList(String type) {//根据用户队列的类型确定用户的生成速度
this.type = type;
if (type == "VIP")
speed = 1;
if (type == "NORMAL")
speed = 6;
if (type == "QUICKLY")
speed = 3;
}
private void randPerson() {//随机生成不同类型的客户
if (random.nextInt(10) < speed)
personlist.addLast(new Person(randTime(), type + personNum++));
}
private int randTime() {//为每个客户随机生成办理业务所需要的时间
if (type == "QUICKLY")
return minTime;
return random.nextInt(4) + minTime;
}
public void run() {
while (true) {
randPerson();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized Person getPerson() {
return personlist.pollFirst();
}
}
class ServerWindow extends Thread {
private PersonList SON;//正常服务时的客户队列
private PersonList SOF;//空闲时服务的客户队列
private String windowName;//服务窗口名称
public ServerWindow(String windowName, PersonList SON, PersonList SOF) {
this.windowName = windowName;
this.SON = SON;
this.SOF = SOF;
}
private boolean ServerOnNormal() {//窗口正常工作时调用该函数为各自的用户队列服务,当窗口变为空闲时该函数返回false
Person serveringPerson = SON.getPerson();
if (serveringPerson != null) {
System.out.println(windowName + ":---当前正在为"
+ serveringPerson.getPersonName() + "服务");
try {
Thread.sleep(serveringPerson.getServerTime() * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowName + "为:---" + serveringPerson.getPersonName()+"服务"+serveringPerson.getServerTime()+"秒"
+ "已经办理完业务,请下一位");
return true;
}
return false;
}
private void ServerOnFree() {//窗口空闲时调用该函数为普通用户服务
Person serveringPerson = SOF.getPerson();
if (serveringPerson != null) {
System.out.println(windowName + ":---当前正在为"
+ serveringPerson.getPersonName()+ "服务");
try {
Thread.sleep(serveringPerson.getServerTime() * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowName + "为:---" + serveringPerson.getPersonName()+"服务"+serveringPerson.getServerTime()+"秒"
+ "已经办理完业务,请下一位");
}
}
public void run() {
while (true) {
if (!ServerOnNormal())
ServerOnFree();
}
}
}
class Person {//客户类
private int ServerTime;//客户需要服务的时间
private String PersonName;//客户名字
public int getServerTime() {
return ServerTime;
}
public String getPersonName(){
return PersonName;
}
public Person(int ServerTime, String PersonName) {
this.ServerTime = ServerTime;
this.PersonName = PersonName;
}
}
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
详细请查看:www.itheima.com