----------------------
android培訓、java培訓、期待與您交流!
----------------------
銀行業務調度系統題目如下:
1. 共6個業務視窗,1-4是普通視窗,5是快速視窗,6是VIP視窗;分別對應三種類型的客戶:
普通客戶,快速客戶, VIP客戶
2. 隨機產生各種類型的客戶,
產生各類型客戶的機率比例為普通 : 快速 : VIP = 6 : 3 :1
3. 客戶辦理業務時間有最大和最小值之分, VIP和普通客戶所需服務時間在允許範圍內隨機設定,快速客戶為最小值
4. 具體服務邏輯與現實生活相同,
如: 當VIP和快速視窗沒有客戶時,可以為普通客戶服務
物件導向的分析與設計
有三種對應類型的客戶:VIP客戶,普通客戶,快速客戶,非同步隨機產生各種類型的客戶,各類型客戶在其對應視窗按順序依次辦理業務。
每一個客戶其實就是由銀行的一個取號機器產生號碼的方式來表示的。那麼,我們需要有一個號碼管理器對象,讓這個對象不斷地產生號碼,就等於隨機產生了客戶。
由於有三類客戶,並且每類客戶的號碼編排都是完全獨立的,所以,這個系統一共要產生三個號碼管理器對象,他們分別各自管理一類使用者的排隊號碼。但是,銀行的號碼管理系統只能有一個,所以它需要設計成單例模式。
各種客戶在各自視窗按順序辦理業務,轉化為物件導向設計來說,我們可以認為是各個視窗在依次叫號。也就是每次都是通過號碼管理器擷取當前要被服務的號碼。
取號機→
擷取普通號();擷取VIP號();擷取快速號();擷取對象();
←服務視窗
開始();
普通客戶();快速客戶();VIP客戶();
↑
號碼管理器→
客戶出現頻率();取號();
實現code:
首先需要先實現的是號碼管理器:NumberManager,它的作用是用來產生號和取號。因為這兩個號碼要用不同的線程進行操作,同時先取到號碼的客戶先進行服務,所以這兩個線程要同步進行。
NumberManager.java
public class NumberManager {
private int lastNumber = 1;
private List<Integer> queueNumber = new ArrayList<Integer>(); //排隊號碼
public synchronized Integer generageNewManager() { //
產生一個號碼
queueNumber.add(lastNumber);
return lastNumber++;
}
public synchronized Integer fetchServiceNumber() { //取號
return queueNumber.remove(0);
}}
//------------------------------號碼機器
NumberMechine.java
public class NumberMachine { //號碼機器
//返回三個管理器
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();//然後執行個體化
}
import java.util.Random;
import java.util.concurrent.Executors;
public void start(){ //開始叫號,用線程池
Executors.newSingleThreadScheduledExecutor().execute(new Runnable() {//線程池裡找空閑線程
public void run() {
while(true){//不停的取號碼
switch(type){ //switch也能識別枚舉類型
case COMMON: //普通使用者得到普通號碼
commonService();
break;
case EXPRESS: //快速使用者得到普通號碼
expressService();
break;
case VIP: //vip使用者得到普通號碼
vipService();
break;
}
}
}
});
}
//----------------------------------------------------------
// CustomerType.java 使用者類型
public enum CustomerType {//三種顧客類型,普通,快速,VIP
COMMON,EXPRESS,VIP;
//重寫toString方法,便於理解
public String toString(){
switch(this){//當前對象
case COMMON:
return "普通";
case EXPRESS:
return "快速";
case VIP:
return name();
}
return null;
}}
// ServiceWindow.java 服務視窗
1.定義一個start方法,內部啟動一個線程,根據服務視窗的類別分別迴圈調用三個不同的方法。
2.定義三個方法分別對三種客戶進行服務,為了觀察運行效果,應詳細列印出其中的細節資訊。
普通服務
private void commonService(){
String windowName="第"+windowId+"號"+type+"視窗";
System.out.println(windowName+"正在擷取任務");
Integer number= NumberMachine.getInstance().getCommonManager().fetchNumber();
if(number!=null){
System.out.println(windowName+"為第"+number+"個"+"普通"+"客戶服務");
long beginTime=System.currentTimeMillis();
//最大的隨機值
int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;//值9000
long serveTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;//1001
--10000毫秒
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;//花費時間
System.out.println(windowName+"為第"+number+"個"+"普通"+"客戶完成服務,耗
時"+costTime/1000+"秒");
System.out.println();
}else{
System.out.println(windowName+"沒有取到任務,先休息1秒鐘");
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().fetchNumber();
if(number!=null){
System.out.println(windowName+"為第"+number+"個"+type+"客戶服務");
long beginTime=System.currentTimeMillis();
long serveTime=Constants.MIN_SERVICE_TIME;//只能是最小值
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;//花費時間
System.out.println(windowName+"為第"+number+"個"+type+"客戶完成服務,耗
時"+costTime/1000+"秒");
System.out.println();
}else{
System.out.println(windowName+"沒有取到任務");
commonService();
}
}
//vip服務
private void vipService(){
String windowName="第"+windowId+"號"+type+"視窗";
System.out.println(windowName+"正在擷取任務");
Integer number= NumberMachine.getInstance().getVipManager().fetchNumber();
if(number!=null){
System.out.println(windowName+"為第"+number+"個"+type+"客戶服務");
long beginTime=System.currentTimeMillis();
//最大的隨機值
int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;//值9000
long serveTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;//1001
--10000毫秒
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;//花費時間
System.out.println(windowName+"為第"+number+"個"+type+"客戶完成服務,耗
時"+costTime/1000+"秒");
System.out.println();
}else{
System.out.println(windowName+"沒有取到任務");
commonService();
}
}
----------------------
android培訓、java培訓、期待與您交流!
----------------------
----------------------詳細請查看:http://edu.csdn.net/heima----------------------