銀行業務調度系統
類比實現銀行業務調度系統邏輯,具體需求如下:
Ø 銀行內有6個業務視窗,1 - 4號視窗為普通視窗,5號視窗為快速視窗,6號視窗為VIP視窗。
Ø 有三種對應類型的客戶:VIP客戶,普通客戶,快速客戶(辦理如交水電費、電話費之類業務的客戶)。
Ø 非同步隨機產生各種類型的客戶,產生各類型使用者的機率比例為:
VIP客戶 :普通客戶 :快速客戶 = 1 :6 :3。
Ø 客戶辦理業務所需時間有最大值和最小值,在該範圍內隨機設定每個VIP客戶以及普通客戶辦理業務所需的時間,快速客戶辦理業務所需時間為最小值(提示:辦理業務的過程可通過線程Sleep的方式類比)。
Ø 各類型客戶在其對應視窗按順序依次辦理業務。
Ø 當VIP(6號)視窗和快速業務(5號)視窗沒有客戶等待辦理業務的時候,這兩個視窗可以處理普通客戶的業務,而一旦有對應的客戶等待辦理業務的時候,則優先處理對應客戶的業務。
Ø 隨機產生客戶時間間隔以及業務辦理時間最大值和最小值自定,可以設定。
Ø 不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展現程式運行結果。
用到的技術:
1、物件導向的設計
2、線程池的使用
3、枚舉
4、單例設計模式
類中設計主要方法:NumberManager-----產號和取號
NumberMachine------相當於銀行的自動取號機,單例設計,能夠產生3類不同的號
ServiceWindow-----相當於銀行的視窗,具有叫號,處理的功能
主要代碼實現:
NumberManager
publicclassNumberManager {
privateintlastNumber=0;
List<Integer>queueNumbers=new ArrayList<Integer>();
publicsynchronized Integer generateNumber(){
queueNumbers.add(++lastNumber);
returnlastNumber;
}
publicsynchronized Integer fetchNumber(){
if(queueNumbers.size()>0)
returnqueueNumbers.remove(0);
else
returnnull;
}
}
NumberMachine:
package cn.itcast.bank;
publicclassNumberMachine {
private NumberMachine(){}
publicstaticNumberMachineinstance=newNumberMachine();
publicstaticNumberMachine getInstance(){
returninstance;
}
private NumberManagercommonManager=new NumberManager();
private NumberManagerfastManager=new NumberManager();
private NumberManagerVipManager=new NumberManager();
public NumberManager getCommomManager(){
returncommonManager;
}
public NumberManager getFastManager(){
returnfastManager;
}
public NumberManager getVipManager(){
returnVipManager;
}
}
ServiceWindow
package cn.itcast.bank;
import java.util.Random;
import java.util.concurrent.Executors;
publicclassServiceWindow {
private CustomerTypetype = CustomerType.COMMON;
privateintnumber = 1;
publicvoid setType(CustomerType type) {
this.type = type;
}
publicvoid setNumber(int number) {
this.number = number;
}
publicvoid start() {
Executors.newSingleThreadExecutor().execute(new Runnable() {
publicvoid run() {
while (true) {
switch (type) {
caseCOMMON:
commonService();
break;
caseFAST:
fastService();
break;
caseVIP:
vipService();
break;
}
}
}
});
}
privatevoid commonService() {
String windowName ="第" +number + "號" +type +"視窗";
System.out.println(windowName +"開始擷取普通任務");
Integer serviceNumber = NumberMachine.getInstance().getCommomManager()
.fetchNumber();
if (serviceNumber !=null) {
System.out.println(windowName +"開始為" + serviceNumber +"號普通客戶服務");
int time =new Random().nextInt(10) + 1;
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("完成對" + serviceNumber + "號普通客戶的服務,耗時" + time
+ "秒");
} else {
System.out.println(windowName +"沒有擷取到普通任務,正在空閑一秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
privatevoid fastService() {
String windowName ="第" +number + "號" +type +"視窗";
System.out.println(windowName +"開始擷取快速任務");
Integer serviceNumber = NumberMachine.getInstance().getFastManager()
.fetchNumber();
if (serviceNumber !=null) {
System.out.println(windowName +"開始為" + serviceNumber +"號快速客戶服務");
int time =new Random().nextInt(5) + 1;
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("完成對" + serviceNumber + "號快速客戶的服務,耗時" + time
+ "秒");
} else {
System.out.println(windowName +"沒有擷取到快速任務,正在準備擷取普通任務");
commonService();
}
}
privatevoid vipService() {
String windowName ="第" +number + "號" +type +"視窗";
System.out.println(windowName +"開始擷取vip任務");
Integer serviceNumber = NumberMachine.getInstance().getCommomManager()
.fetchNumber();
if (serviceNumber !=null) {
System.out.println(windowName +"開始為" + serviceNumber +"號vip客戶服務");
int time =new Random().nextInt(8) + 1;
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("完成對" + serviceNumber + "號vip客戶的服務,耗時" + time
+ "秒");
} else {
System.out.println(windowName +"沒有擷取到vip任務,正在準備擷取普通任務");
commonService();
}
}
}