您的位置:首页 > 职场人生

黑马程序员------银行调度系统

2013-04-24 10:59 211 查看
android培训java培训

银行业务调度系统

银行业务调度系统可分为两大部分,一个是业务办理窗口部分,一个是叫号机部分。

  1,业务办理部分。

     需要实现对普通业务客户,快速业务客户,vip业务客户的分别处理。当快速业务窗口和vip业务

     窗口没有需要办理的业务时,可以办理普通业务。

     窗口办理业务前须查看是否有等待办理业务的客户,如果有则开始办理,同时模拟办理业务的随机

     耗时时间。普通业务窗口如果没有等待办理业务的客户则停留1秒后继续办理,快速和vip窗口没有

     则跳到办理普通业务。

  2,叫号机部分。

    叫号机主要分为两个类,一个是叫号机本身,一个是号码管理器。

    叫号机需要设计成单例模式,因为三种业务的号码管理器需要同用一个叫号机。

    叫号机还需提供分别获取三个业务管理器的get方法。

    号码管理器需要实现两个功能,一个是产生新号码,一个是移除已办理完的号码。 产生的号码需要保存在

    一个集合中,以便依照先后顺序逐个办理。

   

具体实现需要六个类:一个枚举类(CustomerType)保存固定的三个类型客户,

                   一个常量类(Constants)保存模拟办理业务的最长用时和最短用时和

                      产生普通客户的平均用时。

                   一个叫号机类(NumberMachine)

                   一个号码管理器类(NumberManager)

                   一个业务窗口类(ServiceWindow)

                   一个主函数类(MainClass)

CustomerType
public enum CustomerType {
COMMON,EXPRESS,VIP;

public String toString(){
String name = null;
switch(this){
case COMMON:
name = "普通";
break;
case EXPRESS:
name = "快速";
break;
case VIP:
//枚举的name()方法返回调用者的名字。
name = name();
break;
}
return name;
}
}
Constants
public class Constants {
public static int MAX_SERVICE_TIME = 10000;
public static int MIN_SEEVICE_TIME = 1000;
public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}
NumberMachine
public class NumberMachine {
//单例设计模式
private NumberMachine(){}
private static NumberMachine instance = new NumberMachine();
public static NumberMachine getInstance(){
return instance;
}
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;
}
}
NumberManager
public class NumberManager {
private int lastNumber = 0;
private List queueNumbers = new ArrayList();

public synchronized Integer generateNewNumber(){
//在上一个号码上+1后存入集合。
queueNumbers.add(++lastNumber);
return lastNumber;
}

public synchronized Integer fetchNumber(){
if(queueNumbers.size()>0){
//remove()方法:移除同时返回被移除的对象。
return (Integer) queueNumbers.remove(0);
}
else{
return null;
}
}
}
ServiceWindow
public class ServiceWindow {
//不指定的情况下默认产生普通业务窗口。
private CustomerType type = CustomerType.COMMON;
private int number = 1;

public CustomerType getType() {
return type;
}
public void setType(CustomerType type) {
this.type = type;
}
public void setNumber(int number) {
this.number = number;
}

public void start(){
//创建一个线程。
Executors.newSingleThreadExecutor().execute(new Runnable(){
public void run(){
while(true){
switch(type){
case COMMON:
commonService();
break;
case EXPRESS:
expressService();
break;
case VIP:
vipService();
break;
}
}
}
});

}

private void commonService(){
String windosName = "第" + number + "号" + type + "窗口";
System.out.println(windosName + "开始获取业务 ");
//需要先获取NumberMachine对象,再通过对象获取号码管理器。
Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchNumber();
if(serviceNumber != null){
System.out.println(windosName + "正在办理" + serviceNumber + "号普通业务");

int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SEEVICE_TIME;
//产生随机数需要在规定的最大用时和最小用时之间。在加上最小用时则能保证不小于最小值也不大于最大值。
int serviceTime = new Random().nextInt(maxRandom)+1+Constants.MIN_SEEVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {

e.printStackTrace();
}
System.out.println(windosName+"办理"+serviceNumber+"号普通业务用时"+serviceTime/1000+"秒");
}

else{
System.out.println(windosName + "没有获取到业务,休息1秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void expressService(){
String windosName = "第" + number + "号" + type + "窗口";
System.out.println(windosName + "开始获取业务");
Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber();
if(serviceNumber != null){
System.out.print(windosName + "正在办理" + serviceNumber + "号快速业务");
//int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SEEVICE_TIME;
int serviceTime = Constants.MIN_SEEVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(windosName+"办理"+serviceNumber+"号快速业务用时"+serviceTime/1000+"秒");
}

else{
System.out.println(windosName + "没有获取到快速业务,尝试获取普通业务");
commonService();
}
}
private void vipService(){
String windosName = "第" + number + "号" + type + "窗口";
System.out.println(windosName + "开始获取业务");
Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber();
if(serviceNumber != null){
System.out.print(windosName + "正在办理" + serviceNumber + "号vip业务");
int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SEEVICE_TIME;
int serviceTime = new Random().nextInt(maxRandom)+1+Constants.MIN_SEEVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(windosName+"办理"+serviceNumber+"号vip业务用时"+serviceTime/1000+"秒");
}

else{
System.out.println(windosName + "没有获取到vip业务,尝试获取普通业务");
commonService();
}
}
}
MainClass
public class MainClass {

/**
* @param args
*/
public static void main(String[] args) {
4000
//通过循环产生并开启4个普通窗口,同时设置窗口号。
for(int i=1;i<5;i++){
ServiceWindow windos = new ServiceWindow();
windos.setNumber(i);
windos.start();
}

ServiceWindow expressWindos = new ServiceWindow();
//设置产生窗口类型为CustomerType.EXPRESS。
expressWindos.setType(CustomerType.EXPRESS);
expressWindos.start();

ServiceWindow vipWindos = new ServiceWindow();
expressWindos.setType(CustomerType.VIP);
vipWindos.start();

//产生3个定时器线程,模拟每隔一段时间产生3类不同类型客户。
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){
public void run(){
Integer serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewNumber();
System.out.println("第"+serviceNumber+"号普通业务客户等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME,
TimeUnit.SECONDS
);

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){
public void run(){
Integer serviceNumber = NumberMachine.getInstance().getExpressManager().generateNewNumber();
System.out.println("第"+serviceNumber+"号快速业务客户等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME*2,
TimeUnit.SECONDS
);

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){
public void run(){
Integer serviceNumber = NumberMachine.getInstance().getVipManager().generateNewNumber();
System.out.println("第"+serviceNumber+"号vip业务客户等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,
TimeUnit.SECONDS
);
}

}


运行结果如下

    第2号普通窗口开始获取业务

    第2号普通窗口正在办理12号普通业务

    第13号普通业务客户等待服务

    第7号快速业务客户等待服务

    第3号vip业务客户等待服务

    第3号普通窗口办理11号普通业务用时2秒

    第3号普通窗口开始获取业务

    第3号普通窗口正在办理13号普通业务

    第4号普通窗口办理5号普通业务用时7秒

    第4号普通窗口开始获取业务

    第4号普通窗口没有获取到业务,休息1秒

    第14号普通业务客户等待服务

    第4号普通窗口开始获取业务

    第4号普通窗口正在办理14号普通业务

    第15号普通业务客户等待服务

    第8号快速业务客户等待服务

    第1号VIP窗口办理6号普通业务用时8秒

    第1号VIP窗口开始获取业务

    第1号VIP窗口正在办理2号vip业务

    第3号普通窗口办理13号普通业务用时2秒

    第3号普通窗口开始获取业务

    第3号普通窗口正在办理15号普通业务

    第17号普通业务客户等待服务

    第9号快速业务客户等待服务

    第1号普通窗口办理10号普通业务用时6秒

    第1号普通窗口开始获取业务

    第1号普通窗口正在办理16号普通业务

    第1号普通窗口办理9号普通业务用时7秒

    第1号普通窗口开始获取业务

    第1号普通窗口正在办理17号普通业务

    第18号普通业务客户等待服务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  黑马程序员