<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    yxhxj2006

    常用鏈接

    統計

    最新評論

    7K月薪面試題----銀行業務調度系統

    題目要求:

    銀行業務調度系統

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

    問題分析:

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

    關系結構分析圖:



    功能細分:


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


    代碼實現

    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;      //創建元素  
    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類 業務調度窗口(核心)


    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(){    //線程池執行任務  
    22.         Executors.newSingleThreadExecutor().execute(new Runnable(){ //匿名內部類  
    23.             public void run(){  
    24.                 while(true){  
    25.                     switch(type){   //switch參數可以是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的參數類型"

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

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


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


    網站導航:
     
    主站蜘蛛池模板: 精品免费AV一区二区三区| 野花香高清在线观看视频播放免费 | AA免费观看的1000部电影| 亚洲精品久久无码| 中文字幕第一页亚洲| 91制片厂制作传媒免费版樱花 | 亚洲精品国产日韩无码AV永久免费网| 国产国拍亚洲精品mv在线观看 | 国产精品免费视频播放器| 免费看少妇高潮成人片| 国产成人精品日本亚洲直接 | 亚洲第一福利视频| 国产资源免费观看| 一区二区免费视频| 男人j进女人p免费视频| 亚洲Av无码一区二区二三区| 亚洲国产成人VA在线观看| 91成年人免费视频| 中文毛片无遮挡高清免费| 亚洲色大成网站WWW国产| 国产亚洲色婷婷久久99精品| 女人18毛片特级一级免费视频| 免费a级毛片无码a∨免费软件| 亚洲AV永久无码天堂影院| 亚洲国产综合精品中文第一区| 国产成人精品高清免费| 在线免费中文字幕| 中文字幕一区二区三区免费视频| 亚洲日韩一区二区三区| 久久亚洲精品成人av无码网站| 亚洲成a人在线看天堂无码| 毛片基地免费观看| 亚洲视频在线免费观看| 免费国产黄网站在线看| 亚洲色偷精品一区二区三区| 亚洲沟沟美女亚洲沟沟| 曰韩亚洲av人人夜夜澡人人爽| 国产福利免费在线观看| 福利免费观看午夜体检区| 免费无码又爽又刺激高潮视频| 国产在线国偷精品免费看|