ASP.Net+Android+IO开发S、.Net培训、期待与您交流!
银行业务调度系统笔记需求分析:对于银行业务调度的设计:银行中有一个号码机器,用于产生三种号码(普通用户,快速用户,VIP用户,每种号码的产生都是互斥的),当来的客户是普通客户,号码机会产生普通用户的号码,从1往后自增;当快速客户进来办理业务时,号码机产生一个快速客户的号码,快速窗口为其办理业务;当一个VIP客户要办理业务时,号码机会产生VIP号码,并由VIP窗口为之办理业务。当快速窗口没有快速客户时,或者VIP窗口没有VIP客户办理业务时,它们都可以接收普通客户,并为之办理相应的业务,这样我们可以使用面向对象的方法将整个系统的业务以对象之间的协调工作来处理
第一、根据张老师在交通等管理系统中对如何确定类及类中的方法可以知道在银行业务调度中我们应该确定的类有服务窗口,产生号码的号码机器,和号码管理器
第二、明确各个类中所拥有的资源,号码管理器,是用来产生号码,它肯定有号码,和用于存放号码的集合。该集合是用于存放在等待的客户信息,同时该类中有一个终于产生数据和取数据的方法,这样可以实现叫号的功能。该类实现方式:
private int lastNumber = 1;//产生的最后一个号码
private List<Integer> queueNumber = new ArrayList<Integer>();//存放等待的客户的集合
public synchronized Integer generateNewManager(){
queueNumber.add(lastNumber);
return lastNumber++;
}
public synchronized Integer fetchServiceNumber()
{
//用于叫号的功能,如果等待队列为空时,返回空指针
if(queueNumber.size()>0){
return (Integer)queueNumber.remove(0);//将对首的客户叫去被服务
}else{
return null;
}
}
产生号码机:本类使用单利设计模式用于产生一个号码管理器对象,(这里含有三个号码管理器的对象)恶汉模式
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(){};
public static NumberMachine getInstance(){
return instance;
}
private static NumberMachine instance = new NumberMachine();
服务窗口:有窗口名,窗口类型;为普通客户服务的普通窗口,为快速客户服务的快速窗口和为VIP客户服务的VIP窗口,三个窗口中普通客户的服务较慢,我们用线程的sleep带代替,快速窗口、Vip窗口没有要服务的客户时,可以为普通客户服务。这里用jdk1.5的新特性线程池技术来处理
private CustomerType type = CustomerType.COMMON;
private int number = 1;
public void start(){
Executors.newSingleThreadExecutor().execute(
new Runnable(){
public void run(){
//下面这种写法的运行效率低,最好是把while放在case下面
while(true){
switch(type){
case COMMON:
commonService();
break;
case EXPRESS:
expressService();
break;
case VIP:
vipService();
break;
}
}
}
}
);
}
private void commonService(){
String windowName = "第" + number + "号" + type + "窗口";
System.out.println(windowName + "开始获取普通任务!");
Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
if(serviceNumber != null ){
System.out.println(windowName + "开始为第" + serviceNumber + "号普通客户服务");
int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowName + "完成为第" + serviceNumber + "号普通客户服务,总共耗时" + serviceTime/1000 + "秒");
}else{
System.out.println(windowName + "没有取到普通任务,正在空闲一秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void expressService(){
Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
String windowName = "第" + number + "号" + type + "窗口";
System.out.println(windowName + "开始获取快速任务!");
if(serviceNumber !=null){
System.out.println(windowName + "开始为第" + serviceNumber + "号快速客户服务");
int serviceTime = Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowName + "完成为第" + serviceNumber + "号快速客户服务,总共耗时" + serviceTime/1000 + "秒");
}else{
System.out.println(windowName + "没有取到快速任务!");
commonService();
}
}
private void vipService(){....}
测试类中使用定时器的方法来产生客户,以下为快速客户的产生过程
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer serviceNumber = NumberMachine.getInstance().getExpressManager().generateNewManager();
System.out.println("第" + serviceNumber + "号快速客户正在等待服务!");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2,
TimeUnit.SECONDS);
ASP.Net+Android+IO开发S、.Net培训、期待与您交流!