yxhxj2006

          常用鏈接

          統(tǒng)計

          最新評論

          7K月薪面試題----銀行業(yè)務調度系統(tǒng)

          題目要求:

          銀行業(yè)務調度系統(tǒng)

          模擬實現(xiàn)銀行業(yè)務調度系統(tǒng)邏輯,具體需求如下:
          *銀行內有6個業(yè)務窗口,1 - 4號窗口為普通窗口,5號窗口為快速窗口,6號窗口為VIP窗口。
          *有三種對應類型的客戶:VIP客戶,普通客戶,快速客戶(辦理如交水電費、電話費之類業(yè)務的客戶)。
          *異步隨機生成各種類型的客戶,生成各類型用戶的概率比例為:
          VIP客戶 :普通客戶 :快速客戶  =  1 :6 :3。
          *客戶辦理業(yè)務所需時間有最大值和最小值,在該范圍內隨機設定每個VIP客戶以及普通客戶辦理業(yè)務所需的時間,
          快速客戶辦理業(yè)務所需時間為最小值(提示:辦理業(yè)務的過程可通過線程Sleep的方式模擬)。
          *各類型客戶在其對應窗口按順序依次辦理業(yè)務。
          當VIP(6號)窗口和快速業(yè)務(5號)窗口沒有客戶等待辦理業(yè)務的時候,這兩個窗口可以處理普通客戶的業(yè)務,
          而一旦有對應的客戶等待辦理業(yè)務的時候,則優(yōu)先處理對應客戶的業(yè)務。
          隨機生成客戶時間間隔以及業(yè)務辦理時間最大值和最小值自定,可以設置。
          不要求實現(xiàn)GUI,只考慮系統(tǒng)邏輯實現(xiàn),可通過Log方式展現(xiàn)程序運行結果。

          問題分析:

          *有三種對應類型的客戶:VIP客戶,普通客戶,快速客戶 ,異步隨機生成各種類型的客戶,
          各類型客戶在其對應窗口按順序依次辦理業(yè)務 。
            *首先,經常在銀行辦理業(yè)務的人更有利于理解本系統(tǒng),每一個客戶其實就是由銀行的一個取號機器產生號碼的方式來表示的。
               所以,我想到要有一個號碼管理器對象,讓這個對象不斷地產生號碼,就等于隨機生成了客戶。
            *由于有三類客戶,每類客戶的號碼編排都是完全獨立的,所以,我想到本系統(tǒng)一共要產生三個號碼管理器對象,
               各自管理一類用戶的排隊號碼。這三個號碼管理器對象統(tǒng)一由一個號碼機器進行管理,
               這個號碼機器在整個系統(tǒng)中始終只能有一個,所以,它要被設計成單例。
            *各類型客戶在其對應窗口按順序依次辦理業(yè)務 ,準確地說,應該是窗口依次叫號。
              *各個窗口怎么知道該叫哪一個號了呢?
                它一定是問的相應的號碼管理器,即服務窗口每次找號碼管理器獲取當前要被服務的號碼。

          關系結構分析圖:



          功能細分:


          1. "NumberManager"類    -->排號  
          2.     定義一個用于存儲上一個客戶號碼的成員變量和用于存儲所有等待服務的客戶號碼的隊列集合。  
          3.     定義一個產生新號碼的方法和獲取馬上要為之服務的號碼的方法,  
          4.         這兩個方法被不同的線程操作了相同的數(shù)據(jù),所以,要進行同步。  
          5.   
          6. "NumberMachine"類    -->號碼管理器,取號  
          7.     定義三個成員變量分別指向三個NumberManager對象,分別表示普通、快速和VIP客戶的號碼管理器,  
          8.     定義三個對應的方法來返回這三個NumberManager對象。  
          9.     將NumberMachine類設計成單例。  
          10.   
          11. "CustomerType"枚舉類  
          12.     系統(tǒng)中有三種類型的客戶,所以用定義一個枚舉類,其中定義三個成員分別表示三種類型的客戶。  
          13.     重寫toString方法,返回類型的中文名稱。這是在后面編碼時重構出來的,剛開始不用考慮。  
          14.   
          15. "ServiceWindow"類    -->業(yè)務窗口  
          16.     定義一個start方法,內部啟動一個線程,根據(jù)服務窗口的類別分別循環(huán)調用三個不同的方法。   
          17.     定義三個方法分別對三種客戶進行服務,為了觀察運行效果,應詳細打印出其中的細節(jié)信息。  
          18.   
          19. "MainClass"類  
          20.     用for循環(huán)創(chuàng)建出4個普通窗口,再創(chuàng)建出1個快速窗口和一個VIP窗口。  
          21.     接著再創(chuàng)建三個定時器,分別定時去創(chuàng)建新的普通客戶號碼、新的快速客戶號碼、新的VIP客戶號碼。  
          22.   
          23. "Constants"類      
          24.     定義三個常量:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME  


          代碼實現(xiàn)

          NumberManager類

          1. import java.util.ArrayList;  
          2. import java.util.List;  
          3.   
          4. public class NumberManager {  
          5.       
          6.     private Integer lastNumber = 0;  
          7.     private List<Integer> queueNumber = new ArrayList<Integer>();  
          8.       
          9.     public synchronized Integer generateNewManager(){   //號碼排隊  
          10.         queueNumber.add(++lastNumber);//添加元素  
          11.         return lastNumber;      //創(chuàng)建元素  
          12.     }  
          13.       
          14.     public synchronized Integer fetchServiceNumber(){   //使用號碼獲取服務  
          15.         if(queueNumber.size() >0)  
          16.             return queueNumber.remove(0);//remove返回值為該角標上元素  
          17.         else  
          18.             return null;  
          19.     }  
          20. }  

          NumberMechine類

          取票機

          1. public class NumberMachine {  
          2.   
          3.     private NumberMachine(){};  //單例模式,只有一個取票機  
          4.     private static NumberMachine instance = new NumberMachine();  
          5.     public static NumberMachine getInstance(){  
          6.         return instance;  
          7.     }  
          8.     //取票機中有三種票,對應各自的取出方法  
          9.     private NumberManager commonManager = new NumberManager();  
          10.     private NumberManager expressManager = new NumberManager();  
          11.     private NumberManager vipManager = new NumberManager();  
          12.       
          13.     public NumberManager getCommonManager() {  
          14.         return commonManager;  
          15.     }  
          16.     public NumberManager getExpressManager() {  
          17.         return expressManager;  
          18.     }  
          19.     public NumberManager getVipManager() {  
          20.         return vipManager;  
          21.     }     
          22. }  

          CustomerType枚舉類

          客戶類型

          1. public enum CustomerType {  
          2.     COMMON,EXPRESS,VIP;  
          3.       
          4.     public String toString(){   //switch 接收類型為int 或 Enum 類型  
          5.         switch(this){  
          6.         case COMMON:  
          7.             return "普通";  
          8.         case EXPRESS:  
          9.             return "快速";  
          10.         }  
          11.         return "VIP";  
          12.     }  
          13. }  

          Constants常量類


          1. public class Constants {    //常量  
          2.       
          3.     public final static int Max_Service_Time = 10000;  
          4.     public final static int Min_Service_Time = 1000;  
          5.     public final static int Common_Customer_Interval_Time = 1;  
          6.   
          7. }  

          ServiceWindow類 業(yè)務調度窗口(核心)


          1. package com.itheima;  
          2.   
          3. import java.util.Random;  
          4. import java.util.concurrent.Executors;  
          5.   
          6. public class ServiceWindow {  
          7.     private CustomerType type = CustomerType.COMMON;//客戶類型  
          8.     private int windowId = 1;   //窗口號碼  
          9.       
          10.       
          11.     public CustomerType getType(){  
          12.         return type;  
          13.     }  
          14.     public void setType(CustomerType type) {  
          15.         this.type = type;  
          16.     }  
          17.     public void setWindowId(int windowId) {  
          18.         this.windowId = windowId;  
          19.     }  
          20.       
          21.     public void start(){    //線程池執(zhí)行任務  
          22.         Executors.newSingleThreadExecutor().execute(new Runnable(){ //匿名內部類  
          23.             public void run(){  
          24.                 while(true){  
          25.                     switch(type){   //switch參數(shù)可以是int或 Enum  
          26.                     case COMMON:  
          27.                         commonService();      
          28.                         break;  
          29.                     case EXPRESS:  
          30.                         expressService();  
          31.                         break;  
          32.                     case VIP:  
          33.                         vipService();  
          34.                         break;  
          35.                     }             
          36.                 }  
          37.             }  
          38.         });  
          39.     }  
          40.         //普通客戶  
          41.         private void commonService() {  
          42.             String windowName = windowId + "號" + type +"窗口";                          
          43.             System.out.println(windowName+"正在獲取任務...");  
          44.             Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();  
          45.             if(number !=null){  
          46.                 int maxRandom = Constants.Max_Service_Time - Constants.Min_Service_Time;  
          47.                 long serverTime = new Random().nextInt(maxRandom)+1+Constants.Min_Service_Time;  
          48.                 try {  
          49.                     Thread.sleep(serverTime);   //服務時間  
          50.                 } catch (InterruptedException e) {  
          51.                     e.printStackTrace();  
          52.                 }  
          53.                 System.out.println(windowName + "完成為第" +number+"個普通客戶服務;耗時: "+serverTime+" Millis");  
          54.             }  
          55.             else{  
          56.                 System.out.println(windowName+"沒有任務...休息1秒鐘...");  
          57.                 try {  
          58.                     Thread.sleep(1000);         //等待時間  
          59.                 } catch (InterruptedException e) {  
          60.                     e.printStackTrace();  
          61.                 }  
          62.             }  
          63.         }  
          64.         //VIP客戶  
          65.         private void vipService() {  
          66.             String windowName = windowId + "號" + type +"窗口";                          
          67.             System.out.println(windowName+"正在獲取任務...");  
          68.             Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber();  
          69.             if(number !=null){  
          70.                 int maxRandom = Constants.Max_Service_Time - Constants.Min_Service_Time;  
          71.                 long serverTime = new Random().nextInt(maxRandom)+1+Constants.Min_Service_Time;  
          72.                 try {  
          73.                     Thread.sleep(serverTime);   //服務時間  
          74.                 } catch (InterruptedException e) {  
          75.                     e.printStackTrace();  
          76.                 }  
          77.                 System.out.println(windowName + "完成為第" +number+"個"+type+"客戶服務;耗時: "+serverTime+" Millis");  
          78.             }  
          79.             else{  
          80.                 System.out.println(windowName+"沒有VIP任務...為普通客戶服務...");  
          81.                 commonService();    //為普通客戶服務  
          82.   
          83.             }  
          84.         }  
          85.           
          86.           
          87.         private void expressService() {  
          88.             String windowName = windowId + "號" + type +"窗口";                          
          89.             System.out.println(windowName+"正在獲取任務...");  
          90.             Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();  
          91.             if(number !=null){  
          92.                 int serviceTime = Constants.Min_Service_Time;  
          93.                 try {  
          94.                     Thread.sleep(serviceTime);  //快速客戶服務時間,最小值  
          95.                 } catch (InterruptedException e) {  
          96.                     e.printStackTrace();  
          97.                 }  
          98.                 System.out.println(windowName + "完成為第" +number+"個"+type+"客戶服務;耗時: "+serviceTime+" Millis");  
          99.             }  
          100.             else{  
          101.                 System.out.println(windowName+"沒有快速任務...為普通客戶服務...");  
          102.                 commonService();    //為普通客戶服務  
          103.   
          104.             }  
          105.         }  
          106.           
          107.           
          108.           
          109.       
          110. }  



          MainClass 用于測試


          1. package com.itheima;  
          2.   
          3. import java.util.concurrent.Executors;  
          4. import java.util.concurrent.TimeUnit;  
          5.   
          6. public class MainClass {  
          7.   
          8.     /** 
          9.      * @param args 
          10.      */  
          11.     public static void main(String[] args) {  
          12.           
          13.         //產生四個普通窗口  
          14.         for(int i=1; i<5 ;i++){  
          15.             ServiceWindow commonWindow = new ServiceWindow();  
          16.             commonWindow.setWindowId(i);  
          17.             commonWindow.start();  
          18.         }  
          19.         //產生一個VIP窗口  
          20.         ServiceWindow expressWindow = new ServiceWindow();  
          21.         expressWindow.setType(CustomerType.VIP);    //設置客戶類型VIP  
          22.         expressWindow.start();  
          23.         //產生一個快速窗口  
          24.         ServiceWindow vipWindow = new ServiceWindow();  
          25.         vipWindow.setType(CustomerType.EXPRESS);    //設置客戶類型 快速  
          26.         vipWindow.start();  
          27.           
          28.         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(  
          29.                 new Runnable(){         //匿名內部類  
          30.                     public void run(){  //普通客戶  
          31.                         Integer number = NumberMachine.getInstance().getCommonManager().generateNewManager();  
          32.                         System.out.println(number + "號普通客戶等待服務");  
          33.                           
          34.                     }  
          35.                 },  
          36.                 0,  
          37.                 Constants.Common_Customer_Interval_Time,   
          38.                 TimeUnit.SECONDS);  
          39.           
          40.         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(  
          41.                 new Runnable(){       
          42.                     public void run(){  //快速客戶  
          43.                         Integer number = NumberMachine.getInstance().getExpressManager().generateNewManager();  
          44.                         System.out.println(number + "號快速客戶等待服務");  
          45.                     }  
          46.                 },  
          47.                 0,  
          48.                 Constants.Common_Customer_Interval_Time*2,   
          49.                 TimeUnit.SECONDS);  
          50.           
          51.         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(  
          52.                 new Runnable(){       
          53.                     public void run(){  //VIP客戶  
          54.                         Integer number = NumberMachine.getInstance().getVipManager().generateNewManager();  
          55.                         System.out.println(number + "號VIP客戶等待服務");  
          56.                     }  
          57.                 },  
          58.                 0,  
          59.                 Constants.Common_Customer_Interval_Time*6,   
          60.                 TimeUnit.SECONDS);  
          61.           
          62.               
          63.     }  
          64. }  

          運行結果:



          另附:"關于switch的參數(shù)類型"

          switch(expr)中,expr是一個整數(shù)表達式,整數(shù)表達式可以是int基本類型或Integer包裝類型,
          由于,byte,short,char交給 switch 處理時自動轉成了int,所以,這些類型以及這些類型的包裝類型也是可以的。
          因此傳遞給 switch 和case 語句的參數(shù)應該是 int、 short、 char 或者 byte,還有 Enum 
          long,string 由于不能直接轉成 int 所以不能作用于swtich。在jdk 1.7中switch的參數(shù)類型可以是字符串類型。 

          posted on 2014-02-28 01:31 奮斗成就男人 閱讀(260) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網站導航:
           
          主站蜘蛛池模板: 通榆县| 盐池县| 临城县| 治多县| 西贡区| 郎溪县| 长治县| 武冈市| 荃湾区| 绥棱县| 桃源县| 江口县| 色达县| 夏河县| 神池县| 黎城县| 玛纳斯县| 揭阳市| 洪湖市| 封开县| 东乡县| 怀仁县| 裕民县| 曲水县| 栾川县| 东光县| 商洛市| 惠来县| 来安县| 天水市| 漳平市| 康乐县| 靖安县| 旺苍县| 巴林左旗| 枞阳县| 汝州市| 平顶山市| 涞水县| 丽水市| 台前县|