---------------------- android培训、java培训、期待与您交流! ---------------------
银行业务调度系统
模拟实现银行业务调度系统逻辑,具体需求如下:
Ø 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
Ø 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
Ø 异步随机生成各种类型的客户,生成各类型用户的概率比例为:
VIP客户 :普通客户 :快速客户 = 1 :6 :3。
Ø 客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
Ø 各类型客户在其对应窗口按顺序依次办理业务。
Ø 当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
Ø 随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
Ø 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
根据老师讲解,自编代码:
public class MainClass {
public static void main(String[] args) {
int i=1;
for(;i<=4;i++){
new ServiceWindow(CustomerType.COMMON,i).startWindow();
}
new ServiceWindow(CustomerType.VIP,i).startWindow();
i++;
new ServiceWindow(CustomerType.EXPRESS,i).startWindow();
Executors.newSingleThreadScheduledExecutor().
scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Integer num=NumberMachine.getInstance().getCommonNumberManager().
generateWaitingNumber();
System.out.println("第"+num+"号普通客户正在等待服务……"); }
},0,1,TimeUnit.SECONDS);
Executors.newSingleThreadScheduledExecutor().
scheduleAtFixedRate(new Runnable() { public void run() {
Integer num=NumberMachine.getInstance().
getVipNumberManager().generateWaitingNumber();
System.out.println("第"+num+"号VIP正在等待服务……"); }
},0,6,TimeUnit.SECONDS);
Executors.newSingleThreadScheduledExecutor().
scheduleAtFixedRate(new Runnable() {
public void run() {
Integer num=NumberMachine.getInstance().
getExpressNumberManager().generateWaitingNumber();
System.out.println("第"+num+"号快速正在等待服务……");
}
},0,3,TimeUnit.SECONDS);
}
}
public class ServiceWindow {
int windowNunber;
private CustomerType windowType;
public ServiceWindow(CustomerType type, int windowNunber) {
super();
this.windowType = type;
this.windowNunber = windowNunber;
}
int serviceTime = new Random()
.nextInt(CustomerIntervalTime.MAXCUSTOMERINTERVALTIME
- CustomerIntervalTime.MINCUSTOMERINTERVALTIME)
+ 1 + CustomerIntervalTime.MINCUSTOMERINTERVALTIME;
public void startWindow() {
new Thread(new Runnable() {
public void run() {
while (true)
switch (windowType) {
case COMMON:
commonService();
break;
case VIP:
vipService();
break;
case EXPRESS:
expressService();
break;
}
}
}).start();
}
public void commonService() {
String windowName = "第" + windowNunber + "号"+
windowType+"窗口";
System.out.println(windowName + "开始获取普通任务……");
Integer num = NumberMachine.getInstance().
getCommonNumberManager().fetchServiceNumber();
if (num != null) {
System.out.println(windowName + "准备为" + num +
"号普通客户服务……");
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowName + "为" + num +
"号普通客户服务完毕");
} else {
System.out.println(windowName+"暂时没有普通客户,
休息1秒钟……");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void expressService() {
String windowName = "第" + windowNunber + "号"
+windowType+"窗口";
System.out.println(windowName + "开始获取快速任务……");
Integer num = NumberMachine.getInstance().
getExpressNumberManager().fetchServiceNumber();
if (num != null) {
System.out.println(windowName + "准备为" + num
+ "号快速客户服务……");
try {
serviceTime = CustomerIntervalTime.MINCUSTOMERINTERVALTIME;
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowName + "为" + num
+ "号快速客户服务完毕");
} else {
System.out.println(windowName+"暂时没有快速客户,准备获取普通任务");
commonService();
}
}
public void vipService() {
String windowName = "第" + windowNunber + "号"
+windowType+"窗口";
System.out.println(windowName + "开始获取vip任务……");
Integer num = NumberMachine.getInstance().
getVipNumberManager().fetchServiceNumber();
if (num != null) {
System.out.println(windowName + "准备为" + num
+ "号vip客户服务……");
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowName + "为" + num
+ "号vip客户服务完毕");
} else {
System.out.println(windowName+"暂时没有vip客户,准备获取普通任务");
commonService();
}
}
}
public class NumberMachine {
private static NumberMachine nM=new NumberMachine();
private NumberManager commonNumberManager=new NumberManager();
private NumberManager vipNumberManager=new NumberManager();
private NumberManager expressNumberManager=new NumberManager();
public static NumberMachine getInstance(){
return nM;
}
public NumberManager getCommonNumberManager() {
return commonNumberManager;
}
public NumberManager getVipNumberManager() {
return vipNumberManager;
}
public NumberManager getExpressNumberManager() {
return expressNumberManager;
}
}
public class NumberManager {
private List<Integer> numberList=new ArrayList<Integer>();
private Integer waitingNumber=0;
public synchronized Integer generateWaitingNumber(){
Integer num=++waitingNumber;numberList.add(num);
return num;
}
public synchronized Integer fetchServiceNumber(){
if(numberList.size()>0)
return numberList.remove(0);
else
return null;
}
}
public class CustomerIntervalTime {
public static final int MINCUSTOMERINTERVALTIME=1000;
public static final int MAXCUSTOMERINTERVALTIME=10000;
}
public enum CustomerType {
VIP, COMMON, EXPRESS;
public String toString() {
String name = null;
switch (CustomerType.this) {
case VIP:
name = "vip";
break;
case COMMON:
name = "普通";
break;
case EXPRESS:
name = "快速";
break;
}
return name;
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------