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教育訓練、期待與您交流!