-------android培訓、java培訓、期待與您交流! ----------
銀行業務調度系統
一:
模擬實現銀行業務調度系統邏輯,具體需求如下:
1. 銀行內有六個業務窗口,1-4號窗口爲普通窗口,5號爲快速窗口,六號爲VIP窗口。
2. 有三種對應類型的客戶,VIP客戶,普通客戶,快速客戶(辦理如交水電費、電話費之類業務的客戶)。
3. 異步隨機生成各種類型的客戶,生成各用戶概率的比例爲:VIP客戶:普通用戶:快速用戶=1:6:3.
4. 客戶辦理業務所需時間有最大和最小值,在這範圍內隨機設定每個VIP客戶和普通客戶辦理業務所需時間,快速客戶辦理業務所需時間爲最小值(辦理業務的過程可通過線程sleep的方式模擬)。
5. 各類型客戶在其對應窗口按順序依次辦理業務。
6. 當VIP(6)號窗口和快速業務(5)號窗口沒有客戶等待辦理業務的時候,這兩個窗口可以處理普通客戶的業務,而一旦有對應的客戶等待辦理業務的時候,則優先處理對應客戶的業務。
7. 隨機生成客戶時間間隔以及業務辦理時間最大值和最小值自定,可以設置。
8. 不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展現程序運行結果。
二:
分析與設計
1. 有三種對應類型的客戶,VIP客戶,普通客戶,快速客戶,異步隨機生成各種類型的客戶,各類型客戶在其對應窗口按順序依次辦理業務
1. 首先,經常在銀行辦理業務的人更有利於理解本系統。而且可以增加一個取號器對象,讓這個對象不斷產生號碼,就等於隨機生成了客戶。
2. 由於有三類客戶,每類客戶的號碼編排都是完全獨立的,所以本系統要產生三個號碼管理器對象,這個號碼機在整個系統中始終只能有一個,所以它要被設計成單例設計模式。
2. 各類型窗口在其對應窗口按順序依次辦理業務,準確的說,應該是窗口依次叫號。
1. 各個窗口怎麼知道該叫哪一個號呢?它一定問的是相應的號碼管理器,即服務窗口每次找號碼管理器獲取當前要被服務的號碼。
2. 畫圖如下
3. NumberMachine類和NumberManager類。NumberManager類是定義一個用於存儲上一個客戶號碼的成員變量和用於存儲所有等待服務的客戶號碼的隊列集合。定義一個產生新號碼的方法和獲取馬上要爲之服務的號碼的方法,這兩個方法被不同的線程操作了相同的數據,所以,要進行同步。
二:各個類的代碼
1. NumberMachine類的編寫
package com.isoftstone.interview.bank;
public class NumberMachine {
private NumberManger commonManager=new NumberManger();
private NumberManger expressManager=new NumberManger();
private NumberManger vipManager=new NumberManger();
public NumberManger getCommonManager() {
return commonManager;
}
public NumberManger getExpressManager() {
return expressManager;
}
public NumberManger getVipManager() {
return vipManager;
}
}
NumberManager類的編寫
package com.isoftstone.interview.bank;
import java.util.*;
public class NumberManger {
private int lastNumber=1;
private List<Integer> queneNumber=new ArrayList<Integer>();
public synchronized Integer generateNewManager(){
queneNumber.add(lastNumber);
return lastNumber++;
}
public synchronized Integer fetchServiceNumber(){
Integer number=null;
if(queneNumber.size()>0){
return queneNumber.remove(0);
}
return number;
}
}
ServiceWindow類
package com.isoftstone.interview.bank;
import java.util.Random;
import java.util.concurrent.Executors;
public class ServiceWindow {
private CustomerType type = CustomerType.COMMON;
private int windowId=1;
public void setType(CustomerType type) {
this.type = type;
}
public void setWindowId(int windowId) {
this.windowId = windowId;
}
public void start(){
Executors.newSingleThreadExecutor().execute(new Runnable(){
public void run(){
while(true){
switch(type){
case COMMON:
commomService();
break;
case EXPRESS:
break;
case VIP:
break;
}
}
}
});
}
private void commomService() {
String windowName="第"+windowId+"號"+type+"窗口";
System.out.println(windowName+"正在接受任務");
Integer number=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
if(number!=null){
long beginTime=System.currentTimeMillis();
int readTime=(Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME)+1+Constants.MIN_SERVICE_TIME;
long serveTime=new Random().nextInt(readTime);
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"爲第"+number+"個"+type+"客戶完成服務耗時"+costTime/1000+"秒");
}
else{
System.out.println(windowName+"沒有接收到任務,休息一秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void expressService() {
String windowName="第"+windowId+"號"+type+"窗口";
System.out.println(windowName+"正在接受任務");
Integer number=NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
if(number!=null){
long beginTime=System.currentTimeMillis();
// int readTime=(Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME)+1+Constants.MIN_SERVICE_TIME;
// long serveTime=new Random().nextInt(readTime);
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+"沒有接收到任務");
commomService();
}
}
private void vipService() {
String windowName="第"+windowId+"號"+type+"窗口";
System.out.println(windowName+"正在接受任務");
Integer number=NumberMachine.getInstance().getVipManager().fetchServiceNumber();
if(number!=null){
long beginTime=System.currentTimeMillis();
int readTime=(Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME)+1+Constants.MIN_SERVICE_TIME;
long serveTime=new Random().nextInt(readTime);
try {
Thread.sleep(readTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"爲第"+number+"個"+type+"客戶完成服務耗時"+costTime/1000+"秒");
}
else{
System.out.println(windowName+"沒有接收到任務");
commomService();
}
}
}
Customer類
package com.isoftstone.interview.bank;
public enum CustomerType {
COMMON,EXPRESS,VIP;
public String toString(){
switch(this){
case COMMON:
return "普通";
case EXPRESS:
return "快速";
case VIP:
return name();
}
return null;
}
}
MainClass類
package com.isoftstone.interview.bank;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MainClass {
public static void main(String[] args) {
for(int i=1;i<5;i++){
ServiceWindow commonWindow=new ServiceWindow();
commonWindow.setType(CustomerType.COMMON);
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(){
public void run(){
Integer number=NumberMachine.getInstance().getCommonManager().generateNewManager();
System.out.println(number+"號普通客戶等待服務");
}
},
0,
1,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void 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(){
public void run(){
Integer number=NumberMachine.getInstance().getVipManager().generateNewManager();
System.out.println(number+"號Vip客戶等待服務");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,
TimeUnit.SECONDS);
}
}
Constants類
package com.isoftstone.interview.bank;
public class Constants {
public static int MAX_SERVICE_TIME=10000;
public static int MIN_SERVICE_TIME=1000;
public static int COMMON_CUSTOMER_INTERVAL_TIME=1;
}