銀行業務調度邏輯,此問題稍微有複雜,需要根據實際情況將思路整理清晰
窗口
1普通窗口:四個普通窗口,給普通客戶辦理業務,設置一個時間區域,每個客戶辦理業務需要花費的時間是隨即的分佈於這個區域。
2快速窗口:(1)辦理正常的快速業務。
(2)如果空閒,普通客戶正在排隊時,辦理普通客戶業務。
3VIP窗口:(1)辦理VIP客戶業務。
(2)如果空閒,普通客戶正在排隊時,辦理普通客戶業務。
需要三個號碼控制器器爲這三種類型的客戶順序產生號碼。
一個管理機管理這三個號碼控制器。
確定對象:
(1)窗口
(2)號碼控制器
(3)管理機
(4)客戶
這樣就明確了整個業務流程,管理機管理控制器,控制器產生號碼,窗口爲相應的客戶服務。
CustomerType根據需要,可以判定得使用枚舉類型。
NumberManager號碼控制器,有兩個方法一個是產生號碼,一個是得到當前號碼,刪掉。
NumberMachine管理機,控制三個號碼控制器,使用set方法。需要用到單利設計模式。
ServiceWindow窗口服務,三個方法,對應三種類型客戶。
/號碼管理器
publicclass NumberManager {
privateintlastNumber=1;
//排隊序列
private List<Integer>queueNumber =new ArrayList<Integer>();
//產生號碼
//兩個線程訪問相同的數據,容易產生死鎖
publicsynchronized Integer generateNewManager(){
queueNumber.add(lastNumber);
returnlastNumber++;
}
//取號碼
publicsynchronized Integer fetchServiceNumber(){
Integer number =null;
if(queueNumber.size()>0){
returnqueueNumber.remove(0);
}
return number;
}
號碼管理機
publicclass NumberMachine {
private NumberManagercommonManager =new NumberManager();
private NumberManagerexpressManager =new NumberManager();
private NumberManagervipManager =new NumberManager();
public NumberManager getCommonManager() {
returncommonManager;
}
public NumberManager getExpressManager() {
returnexpressManager;
}
public NumberManager getVipManager() {
returnvipManager;
}
//單例設計模式,構造方法私有化,創建對象,獲取對象
private NumberMachine(){}
publicstatic NumberMachine getInstance(){
returninstance;
}
privatestatic NumberMachineinstance =new NumberMachine();
}
CustomerType客戶類型
publicenumCustomerType {
COMMON,EXPRESS,VIP;
public String toString(){
switch(this){
caseCOMMON:
return"普通";
caseEXPRESS:
return"快速";
caseVIP:
//枚舉的name方法就是返回枚舉的名字
return name();
}
returnnull;
}
publicclassServiceWindow {
private CustomerTypetype = CustomerType.COMMON;
privateintwindowId = 1;
publicvoid setType(CustomerType type) {
this.type = type;
}
publicvoid setWindowId(int windowId) {
this.windowId = windowId;
}
publicvoid start(){
//線程池
Executors.newSingleThreadExecutor().execute(new Runnable(){
publicvoid run(){
while(true){
switch(type){
caseCOMMON:
commonService();
break;
caseEXPRESS:
expressService();
break;
caseVIP:
vipService();
break;
}
}
//NumberMachine.getInstance().getCommonManager();
}
});
}
privatevoid commonService() {
String windowName = "第"+windowId+"號"+type+"窗口";
Integer number= NumberMachine.getInstance().getCommonManager().fetchServiceNumber();;
System.out.println(windowName+"正在獲取任務");
if(number !=null){
System.out.println(windowName +"爲第"+number+"個"+"普通"+"客戶服務");
long beginTime=System.currentTimeMillis();
int maxRand = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
long serverTime =new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serverTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime = System.currentTimeMillis()-beginTime;
System.out.println(windowName+"第"+number+"個"+"普通"+"客戶完成服務,耗時"+costTime/1000);
}else{
System.out.println(windowName+"沒有取到"+type+"服務任務,休息一秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
privatevoid expressService() {
String windowName = "第"+windowId+"號"+type+"窗口";
Integer number= NumberMachine.getInstance().getExpressManager().fetchServiceNumber();;
System.out.println(windowName+"正在獲取任務");
if(number !=null){
System.out.println(windowName +"爲第"+number+"個"+type+"客戶服務");
long beginTime=System.currentTimeMillis();
//int maxRand = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
//long serverTime = new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(Constants.MIN_SERVICE_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime = System.currentTimeMillis()-beginTime;
System.out.println(windowName+"第"+number+"個"+type+"客戶完成服務,耗時"+costTime/1000);
}
else{
System.out.println(windowName+"沒有取到"+type+"服務任務");
commonService();
}
}
privatevoid vipService() {
String windowName = "第"+windowId+"號"+type+"窗口";
Integer number= NumberMachine.getInstance().getVipManager().fetchServiceNumber();;
System.out.println(windowName+"正在獲取VIP任務");
if(number !=null){
System.out.println(windowName +"爲第"+number+"個"+type+"客戶服務");
long beginTime=System.currentTimeMillis();
int maxRand = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
long serverTime =new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serverTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime = System.currentTimeMillis()-beginTime;
System.out.println(windowName+"第"+number+"個"+type+"客戶完成服務,耗時"+costTime/1000);
}else{
System.out.println(windowName+"沒有取到"+type+"服務任務");
commonService();
}
}
}
mainclass
publicclass MainClass {
/**
* @param args
*/
publicstaticvoid main(String[] args) {
for(int i =1;i<5;i++){
ServiceWindow commonWindow =new ServiceWindow();
commonWindow.setWindowId(i);
commonWindow.start();
}
ServiceWindow expressWindow =new ServiceWindow();
expressWindow.setType(CustomerType.EXPRESS);
expressWindow.start();
ServiceWindow vipWindow = new ServiceWindow();
vipWindow.setType(CustomerType.VIP);
vipWindow.start();
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
publicvoid run(){
Integer number= NumberMachine.getInstance().getCommonManager().generateNewManager();
System.out.println(number+"普通客戶等待服務");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME,
TimeUnit.SECONDS
);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
publicvoid run(){
Integer number= NumberMachine.getInstance().getExpressManager().generateNewManager();
System.out.println(number+"快速客戶等待服務");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2,
TimeUnit.SECONDS
);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
publicvoid run(){
Integer number= NumberMachine.getInstance().getVipManager().generateNewManager();
System.out.println(number+"VIP客戶等待服務");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME * 60,
TimeUnit.SECONDS
);
}
}
---------------------- android培訓、java培訓、期待與您交流! ----------------------詳細請查看:http://edu.csdn.net/heima