银行业务调度系统

来源:互联网 发布:打印机数据线速度 编辑:程序博客网 时间:2024/05/01 05:16
------ android培训java培训,期待与您交流 ------
黑马程序员 银行业务调度系统
模拟实现银行业务调度系统逻辑,具体要求如下:
1.银行内有6个业务窗口,1-4号为普通窗口,5号为快速窗口,6号为VIP窗口。
2.有三种对应类型的客户,VIP客户,普通客户,快速客户(办理如交水电费,电话费之类业务的客户)。
3.异步随机生成各种类型的客户,生成各类型用户的概率比例自定义。
4.客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需的时间为最小值。
5各类型客户在其对应窗口按顺序依次办理业务。
6当VIP窗口和快速业务窗口没有客户等待办理业务的时候,这两个窗口也可以为普通用户办理业务,而一旦有对应的客户有业务请求时,则优先为对应的客户办理业务。
7随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
8不要求实现GUI,值考虑系统逻辑实现,可通过log方式展现程序运行结果。

该项目面向对象的分析和设计:
本项目中有三种类型的客户,VIP客户,快速客户,普通客户,这三种客户彼此独立,异步随机生成,每一个客户都可由一个银行提供的取号机器产生的号码来表示,有三种客户,则这个取号机器能产生三种不同类型的号码,这三种类型的号码分别由对应的号码管理器对象进行管理,这三个号码管理器对象则由号码机器进行管理,由于号码机器在本系统中始终只有一个,因此设计成单例模式。这一步总结起来就是:一个取号机器,三个号码管理器。
号码管理器类:
package cn.itcast;
import java.util.ArrayList;
import java.util.List;
//numberManager类,用于产生号码管理器对象
public class NumberManager {
private Integer lastNumber=1;
public List queueNum=new ArrayList();
//号码管理器根据客户取号不断产生新的号码
public synchronized Integer generateNewNum(){
//将产生的号码先进行存储
queueNum.add(lastNumber);
return lastNumber++;
}
//根据进度,获取下一个要服务的号码
public synchronized Integer fetchServiceNum(){
if(queueNum.size()>0){
return (Integer) queueNum.remove(0);
}
return null;
}
}
取号机器类:
package cn.itcast;
//一个取号机器
public class NumberMachine {
//三个号码管理器
private NumberManager commonManager= new NumberManager();
private NumberManager expressManager= new NumberManager();
private NumberManager VipManager= new NumberManager();
public NumberManager getCommonManager() {
return commonManager;
}
public NumberManager getExpressManager() {
return expressManager;
}
public NumberManager getVipManager() {
return VipManager;
}
//号码机器只有一个,设计成单例模式
private NumberMachine(){}
private static NumberMachine machine= new NumberMachine();
public static NumberMachine getInstance(){
return machine;
}
}
办理业务时,每种类型每个客户依次排队按顺序办理,并不是客户自己判断是不是轮到自己办理业务了,而应该是窗口叫号呼叫下一个客户办理业务,窗口又是怎么知道下一个客户是谁呢?窗口的数据应该是从号码管理器处得的。这一步总结就是:窗口找号码管理器要号。
客户类型类,用枚举表示:
package cn.itcast;
public enum CustomType {
COMMON,EXPRESS,VIP;
}
服务窗口类:
package cn.itcast;
import java.util.Random;
import java.util.concurrent.Executors;
public class ServiceWindow {
CustomType type= CustomType.COMMON;
Integer windowId=null;
String windowName=null;
public CustomType getType() {
return type;
}
public void setType(CustomType type) {
this.type = type;
}
public Integer getWindowId() {
return windowId;
}
public void setWindowId(Integer windowId) {
this.windowId = windowId;
}
public String getWindowName() {
return windowName;
}
public void setWindowName(String windowName) {
this.windowName = windowName;
}
//服务窗口启动,启动后为每个客户服务,不重复服务
//用只有一个线程的线程池表示
public void start(){
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
while(true){
switch(type){
case COMMON:
commonService();
break;
case EXPRESS:
expressService();
break;
case VIP:
vipService();
break;
}
}
}
private void commonService() {
//服务窗口通过普通号码管理对象取号
Integer num=NumberMachine.getInstance()
.getCommonManager()
.fetchServiceNum();
//返回的号码不为空
if(num!=null){
//定义普通服务时间5到10秒
Integer serviceTime=new Random().nextInt(5000)+1+5000;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
//为普通客户服务的窗口可以变化,可以是快速窗口或VIP窗口
//但服务的客户类型在这里不变
System.out.println(windowId+"号"+type+"窗口正在为"+num+"号普通客户服务,用时"+serviceTime/1000+"秒");
}else{
try {
//没有获取到服务时先休息,然后继续获取
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowId+"号"+type+"窗口未获取到服务,休息1秒");
}
}
private void expressService() {
//快速服务窗口通过快速号码管理对象取号
Integer num=NumberMachine.getInstance()
.getExpressManager()//
.fetchServiceNum();//
//返回的号码不为空
if(num!=null){
//定义快速服务时间3到5秒
Integer serviceTime=new Random().nextInt(2000)+1+3000;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowId+"号快速窗口正在为"+num+"号快速客户服务,用时"+serviceTime/1000+"秒");
}else{
//没有获取到快速服务时则去获取普通服务
commonService();
}
}
private void vipService() {
//VIP服务窗口通过一系列号码管理对象取号
Integer num=NumberMachine.getInstance()
.getVipManager()//
.fetchServiceNum();//
//返回的号码不为空
if(num!=null){
//定义VIP服务时间5到8秒
Integer serviceTime=new Random().nextInt(3000)+1+5000;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowId+"号VIP窗口正在为"+num+"号VIP客户服务,用时"+serviceTime/1000+"秒");
}else{
//未获取到VIP服务时则去获取普通服务
commonService();
}
}
});
}
}
测试类:
package cn.itcast;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class TestBank {
public static void main(String[] args) {
//创建五个普通窗口,一个快速窗口,一个VIP窗口
for (int i =1; i <=5; i++) {
ServiceWindow commonWindow=new ServiceWindow();
commonWindow.setWindowId(i);
commonWindow.setType(CustomType.COMMON);
commonWindow.start();
}
ServiceWindow expressWindow=new ServiceWindow();
expressWindow.setWindowId(1);
expressWindow.setType(CustomType.EXPRESS);
expressWindow.start();
ServiceWindow vipsWindow=new ServiceWindow();
vipsWindow.setWindowId(1);
vipsWindow.setType(CustomType.VIP);
vipsWindow.start();
//模拟普通客户的取号,每隔1秒来一个,用调度线程池实现,以下相同
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(//
new Runnable() {
@Override
public void run() {
Integer num=NumberMachine.getInstance()//
.getCommonManager()//
.generateNewNum();
System.out.println(num+"号普通客户正在等待服务");
}
},
0, //
1,//
TimeUnit.SECONDS);
//模拟快速客户的取号,每隔6秒来一个
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(//
new Runnable() {
@Override
public void run() {
Integer num=NumberMachine.getInstance()//
.getExpressManager()//
.generateNewNum();
System.out.println(num+"号快速客户正在等待服务");
}
},
0, //
6,//
TimeUnit.SECONDS);
//模拟VIP客户的取号,每隔10秒来一个
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(//
new Runnable() {
@Override
public void run() {
Integer num =NumberMachine.getInstance()//
.getVipManager()//
.generateNewNum();
System.out.println(num+"号VIP客户正在等待服务");
}
},
0, //
10,//
TimeUnit.SECONDS);
}
}
测试结果:
1号普通客户正在等待服务
1号快速客户正在等待服务
1号VIP客户正在等待服务
4号COMMON窗口未获取到服务,休息1秒
1号COMMON窗口未获取到服务,休息1秒
5号COMMON窗口未获取到服务,休息1秒
3号COMMON窗口未获取到服务,休息1秒
1号VIP窗口未获取到服务,休息1秒
1号EXPRESS窗口未获取到服务,休息1秒
2号COMMON窗口未获取到服务,休息1秒
2号普通客户正在等待服务
3号COMMON窗口未获取到服务,休息1秒
5号COMMON窗口未获取到服务,休息1秒
1号COMMON窗口未获取到服务,休息1秒
2号COMMON窗口未获取到服务,休息1秒
3号普通客户正在等待服务
1号COMMON窗口未获取到服务,休息1秒
5号COMMON窗口未获取到服务,休息1秒
2号COMMON窗口未获取到服务,休息1秒
4号普通客户正在等待服务
1号COMMON窗口未获取到服务,休息1秒
2号COMMON窗口未获取到服务,休息1秒
5号普通客户正在等待服务
1号快速窗口正在为1号快速客户服务,用时3秒
2号COMMON窗口未获取到服务,休息1秒
6号普通客户正在等待服务
2号COMMON窗口未获取到服务,休息1秒
7号普通客户正在等待服务
2号快速客户正在等待服务
8号普通客户正在等待服务
1号VIP窗口正在为1号VIP客户服务,用时6秒
3号COMMON窗口正在为2号普通客户服务,用时5秒
9号普通客户正在等待服务
10号普通客户正在等待服务
11号普通客户正在等待服务
2号VIP客户正在等待服务
5号COMMON窗口正在为3号普通客户服务,用时7秒
4号COMMON窗口正在为1号普通客户服务,用时9秒
12号普通客户正在等待服务
2号COMMON窗口正在为6号普通客户服务,用时5秒
13号普通客户正在等待服务
3号快速客户正在等待服务
1号COMMON窗口正在为4号普通客户服务,用时8秒
1号EXPRESS窗口正在为5号普通客户服务,用时8秒
14号普通客户正在等待服务
1号VIP窗口正在为7号普通客户服务,用时5秒
15号普通客户正在等待服务
16号普通客户正在等待服务
17号普通客户正在等待服务
4号COMMON窗口正在为10号普通客户服务,用时5秒
5号COMMON窗口正在为9号普通客户服务,用时6秒
3号COMMON窗口正在为8号普通客户服务,用时8秒
1号快速窗口正在为2号快速客户服务,用时3秒
18号普通客户正在等待服务
19号普通客户正在等待服务
4号快速客户正在等待服务
20号普通客户正在等待服务
1号VIP窗口正在为2号VIP客户服务,用时6秒
2号COMMON窗口正在为11号普通客户服务,用时7秒
21号普通客户正在等待服务
3号VIP客户正在等待服务
1号COMMON窗口正在为12号普通客户服务,用时8秒
1号快速窗口正在为3号快速客户服务,用时4秒
22号普通客户正在等待服务
23号普通客户正在等待服务
4号COMMON窗口正在为13号普通客户服务,用时6秒
3号COMMON窗口正在为15号普通客户服务,用时6秒
24号普通客户正在等待服务
25号普通客户正在等待服务
5号快速客户正在等待服务
1号快速窗口正在为4号快速客户服务,用时3秒
26号普通客户正在等待服务
5号COMMON窗口正在为14号普通客户服务,用时9秒
2号COMMON窗口正在为17号普通客户服务,用时5秒
27号普通客户正在等待服务
1号VIP窗口正在为16号普通客户服务,用时6秒
28号普通客户正在等待服务
29号普通客户正在等待服务
1号快速窗口正在为5号快速客户服务,用时3秒
4号COMMON窗口正在为19号普通客户服务,用时6秒
30号普通客户正在等待服务
31号普通客户正在等待服务
6号快速客户正在等待服务
4号VIP客户正在等待服务
1号COMMON窗口正在为18号普通客户服务,用时9秒
3号COMMON窗口正在为20号普通客户服务,用时7秒
32号普通客户正在等待服务
33号普通客户正在等待服务
1号VIP窗口正在为3号VIP客户服务,用时5秒
5号COMMON窗口正在为21号普通客户服务,用时6秒
34号普通客户正在等待服务
35号普通客户正在等待服务
1号EXPRESS窗口正在为23号普通客户服务,用时6秒
2号COMMON窗口正在为22号普通客户服务,用时8秒
36号普通客户正在等待服务
37号普通客户正在等待服务
7号快速客户正在等待服务
38号普通客户正在等待服务
4号COMMON窗口正在为24号普通客户服务,用时8秒
39号普通客户正在等待服务
1号快速窗口正在为6号快速客户服务,用时4秒
1号VIP窗口正在为4号VIP客户服务,用时6秒
40号普通客户正在等待服务
3号COMMON窗口正在为26号普通客户服务,用时8秒
41号普通客户正在等待服务
1号COMMON窗口正在为25号普通客户服务,用时9秒
5号VIP客户正在等待服务
5号COMMON窗口正在为27号普通客户服务,用时7秒
...
------ android培训java培训,期待与您交流 ------
0 0
原创粉丝点击