----------- android培訓、java培訓、期待與您交流! ------------
銀行業務調度系統
類比實現銀行業務調度系統邏輯,具體需求如下:
1、銀行內有6個業務視窗,1 - 4號視窗為普通視窗,5號視窗為快速視窗,6號視窗為VIP視窗。
2、有三種對應類型的客戶:VIP客戶,普通客戶,快速客戶(辦理如交水電費、電話費之類業務的客戶)。
3、非同步隨機產生各種類型的客戶,產生各類型使用者的機率比例為:
VIP客戶 :普通客戶 :快速客戶 = 1 :6 :3。
4、客戶辦理業務所需時間有最大值和最小值,在該範圍內隨機設定每個VIP客戶以及普通客戶辦理業務所需的時間,快速客戶辦理業務所需時間為最小值
(提示:辦理業務的過程可通過線程Sleep的方式類比)。
5、各類型客戶在其對應視窗按順序依次辦理業務。
6、當VIP(6號)視窗和快速業務(5號)視窗沒有客戶等待辦理業務的時候,這兩個視窗可以處理普通客戶的業務,而一旦有對應的客戶等待辦理業務的時候,
則優先處理對應客戶的業務。
7、隨機產生客戶時間間隔以及業務辦理時間最大值和最小值自定,可以設定。
8、不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展現程式運行結果。
物件導向分析:
找類:
1、取號機:銀行客戶到銀行第一件事,就是取號,排隊。
2、號碼管理器:用於告知客戶,誰可以來辦理業務。
3、服務視窗:可以分別為三種類型客戶服務。
4、客戶:三種類型,數組少,固定,可選擇枚舉類型
5、常量:編程過程中發現有固定數位資料,而且經常使用,可以選擇用常量的形式表示。
6、主類,用於啟動服務視窗並類比客戶取號。
總結:編寫代碼時,剛開始有可能一個類只能寫一部分內容,隨著整個系統類別的不斷增加,每個類的實際功能便越寫越清晰。
號碼管理器:具體實現代碼
import java.util.*;public class NumberManager {private int lastNumber;//裝"業務號"資料的容器private List queueNumbers = new ArrayList();//產生業務號,要同步public synchronized int generateNumber() {queueNumbers.add(++lastNumber);return lastNumber;}//取號,要同步public synchronized int getNumber() {if(queueNumbers.size() > 0) {return (Integer) queueNumbers.remove(0);} else {return -1;}}}
取號機:即取號系統
public class NumberMachine {//單例設計,取號系統只有一個。private static NumberMachine instance = new NumberMachine();private NumberMachine() {};public static NumberMachine getInstance() {return instance;}//系統裡有三個不同的號碼管理器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;}}
服務視窗:
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() {System.out.println(type + ":::" + windowId + "開始服務了");//1.5版本的線程建立Executors.newSingleThreadExecutor().execute(new Runnable() {public void run() {while(true) {//不停的提供服務switch(type) {case COMMON :commonService();//服務普通客戶break;case EXPRESS :expressService();//服務快速客戶break;case VIP :vipService();//服務VIP客戶break;}}}});}//普通客戶服務public void commonService() {//視窗名String windowName = "第" + windowId + "號" + type + "視窗";//喊一位客戶號為number的普通客戶int number = NumberMachine.getInstance().getCommonManager().getNumber();System.out.println(windowName + "正在擷取任務");//如果有客戶if(number != -1) {System.out.println(windowName + "為第" + number + "個普通客戶服務");int maxRand = Constants.MAX_SERVICE_TIME;//普通客戶服務時間為1秒-10秒不等。int serveTime = new Random().nextInt(maxRand) + Constants.MIN_SERVICE_TIME;try {Thread.sleep(serveTime);//這個時間段在服務中} catch (InterruptedException e) {e.printStackTrace();}System.out.println(windowName + "為第" + number + "個普通客戶完成服務,耗時" + serveTime + "秒");} //如果沒有客戶else {System.out.println(windowName + "沒有取到服務任務,先休息1秒鐘");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}//快速客戶服務public void expressService() {//視窗名String windowName = "第" + windowId + "號" + type + "視窗";//喊一位客戶號為number的快速客戶int number = NumberMachine.getInstance().getExpressManager().getNumber();System.out.println(windowName + "正在擷取任務");//如果有客戶if(number != -1) {System.out.println(windowName + "為第" + number + "個快速客戶服務");//服務1秒int serveTime = Constants.MIN_SERVICE_TIME;try {Thread.sleep(serveTime);//這個時間段在服務中} catch (InterruptedException e) {e.printStackTrace();}//實際耗時System.out.println(windowName + "為第" + number + "個快速客戶完成服務,耗時" + serveTime + "秒");} //如果沒有客戶else {System.out.println(windowName + "沒有取到服務任務");//為普通客戶服務commonService();}}//VIP客戶服務public void vipService() {//視窗名String windowName = "第" + windowId + "號" + type + "視窗";//喊一位客戶號為number的VIP客戶int number = NumberMachine.getInstance().getVipManager().getNumber();System.out.println(windowName + "正在擷取任務");//如果有客戶if(number != -1) {System.out.println(windowName + "為第" + number + "個VIP客戶服務");int maxRand = Constants.MAX_SERVICE_TIME;//普通客戶服務時間為1秒-10秒不等。int serveTime = new Random().nextInt(maxRand) + Constants.MIN_SERVICE_TIME;try {Thread.sleep(serveTime);//這個時間段在服務中} catch (InterruptedException e) {e.printStackTrace();}System.out.println(windowName + "為第" + number + "個VIP客戶完成服務,耗時" + serveTime + "秒");} //如果沒有客戶else {System.out.println(windowName + "沒有取到服務任務");//為普通客戶服務commonService();}}}
中間用到的枚舉客戶類型:
//枚舉使用者類型public enum CustomerType {COMMON, EXPRESS, VIP;}
常量:
//常量public class Constants {public static int MAX_SERVICE_TIME = 10;//最長服務時間10秒public static int MIN_SERVICE_TIME = 1;//最短服務時間1秒public static int COMMON_SERVICE_INTERVAL_TIME = 1;//普通客戶1秒來一個。}
主啟動類:
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.setWindowId(i);commonWindow.start();}//產生一個快速客戶視窗ServiceWindow expressWindow = new ServiceWindow();expressWindow.setType(CustomerType.EXPRESS);expressWindow.start();//產生一個VIP客戶視窗ServiceWindow vipWindow = new ServiceWindow();vipWindow.setType(CustomerType.VIP);vipWindow.start();//每隔1秒來1位普通客戶要號Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {public void run() {//普通客戶要號int number = NumberMachine.getInstance().getCommonManager().generateNumber();System.out.println("————————————————————————" + number + "號普通客戶等待服務");}}, 0, Constants.COMMON_SERVICE_INTERVAL_TIME, TimeUnit.SECONDS);//每隔2秒來1位快速客戶要號Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {public void run() {//快速客戶要號int number = NumberMachine.getInstance().getExpressManager().generateNumber();System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~" + number + "號快速客戶等待服務");}}, 0, Constants.COMMON_SERVICE_INTERVAL_TIME * 2, TimeUnit.SECONDS);//每隔6秒來1位VIP客戶要號Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {public void run() {//普通客戶要號int number = NumberMachine.getInstance().getVipManager().generateNumber();System.out.println("★★★★★★★★★★★★★★★" + number + "號VIP客戶等待服務");}}, 0, Constants.COMMON_SERVICE_INTERVAL_TIME * 6, TimeUnit.SECONDS);}}
----------------------- android培訓、java培訓、期待與您交流! ----------------------
詳情請查看:http://edu.csdn.net/heima