黑馬程序員_銀行業務調度系統


                                          ----------------------    android培訓    java培訓   期待與您交流!    ----------------------   
              

銀行業務調度系統

模擬實現銀行業務調度系統邏輯,具體需求如下:

Ø 銀行內有6個業務窗口,1 - 4號窗口爲普通窗口,5號窗口爲快速窗口,6號窗口爲VIP窗口。

Ø 有三種對應類型的客戶:VIP客戶,普通客戶,快速客戶(辦理如交水電費、電話費之類業務的客戶)。

Ø 異步隨機生成各種類型的客戶,生成各類型用戶的概率比例爲:

        VIP客戶 :普通客戶 :快速客戶  =  1 3

Ø 客戶辦理業務所需時間有最大值和最小值,在該範圍內隨機設定每個VIP客戶以及普通客戶辦理業務所需的時間,快速客戶辦理業務所需時間爲最小值(提示:辦理業務的過程可通過線程Sleep的方式模擬)。

Ø 各類型客戶在其對應窗口按順序依次辦理業務。 

Ø 當VIP6號)窗口和快速業務(5號)窗口沒有客戶等待辦理業務的時候,這兩個窗口可以處理普通客戶的業務,而一旦有對應的客戶等待辦理業務的時候,則優先處理對應客戶的業務。

Ø 隨機生成客戶時間間隔以及業務辦理時間最大值和最小值自定,可以設置。

Ø 不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展現程序運行結果。



號碼生成器類

  1. package com.itcast.interview.bank;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. public class NumberManager {  
  7.     private int lastNumber=1;//定義號碼從1號開始  
  8.     private List<Integer> queueNumber=new ArrayList<Integer>();//定義一個集合,用來按順序存儲產生的號碼,即來銀行的顧客  
  9.     //下面兩個方法一定出現異步線程,即同時訪問lastNumber這個變量,加上synchronized進行互斥,就可以了  
  10.     public synchronized Integer generateNewManager(){//號碼生成器  
  11.         queueNumber.add(lastNumber);//放到集合中  
  12.         return lastNumber++;//號碼累加,生成下一個號碼  
  13.     }  
  14.     public synchronized Integer fetchServiceNumber(){//取出集合中第一個號碼  
  15.         Integer number=null;  
  16.         if(queueNumber.size()>0){  
  17.             number=queueNumber.remove(0);//從集合中取出最先放進去的第一個元素,在現實中,就是現在排隊排到最前面的客戶  
  18.         }  
  19.         return number;  
  20.     }  
  21. }         

號碼管理類

  1. package com.itcast.interview.bank;  
  2.   
  3. public class NumberMachine {  
  4.     private NumberManager commonManager =new NumberManager();  
  5.     private NumberManager expressManager =new NumberManager();  
  6.     private NumberManager vipManager =new NumberManager();  
  7.       
  8.     //分別得到三個對象的get方法  
  9.     public NumberManager getCommonManager() {  
  10.         return commonManager;  
  11.     }  
  12.     public NumberManager getExpressManager() {  
  13.         return expressManager;  
  14.     }  
  15.     public NumberManager getVipManager() {  
  16.         return vipManager;  
  17.     }  
  18.       
  19.     //對本類即數字管理器進行單例設計模式  
  20.     private static NumberMachine nm=new NumberMachine();  
  21.     //構造方法私有化  
  22.     private NumberMachine(){  
  23.           
  24.     }   
  25.     //返回實例對象的方法,要靜態實例化調用  
  26.     public static NumberMachine getInstance(){  
  27.         return nm;  
  28.     }  
  29. }  

服務窗口類

  1. package com.itcast.interview.bank;  
  2.   
  3. import java.util.Random;  
  4. import java.util.concurrent.Executors;  
  5. /** 
  6.  * Myeclipse應用----方法抽取 
  7.  * 抽取代碼自動封裝成方法 
  8.  * 1,選中所要抽取的方法代碼,單擊右鍵--》Refactor--》Extract Method即可 
  9.  * 2,快捷鍵 ,選中所要抽取的方法代碼,alt+shift+m即可 
  10.  *  
  11.  * @author zjw 
  12.  * 
  13.  */  
  14. public class ServiceWindow {  
  15.     private CustomerType type=CustomerType.COMMON;  
  16.     private int windowId=1;  
  17.     public void setWindowId(int windowId){  
  18.         this.windowId=windowId;  
  19.     }  
  20.     public void setCustomerType(CustomerType type){  
  21.         this.type=type;  
  22.     }  
  23.       
  24.       
  25.     public void start(){  
  26.         Executors.newSingleThreadExecutor().execute(new Runnable(){  
  27.             public void run(){  
  28. //              if(type==CustomerType.COMMON){  
  29. //                  NumberMachine.getInstance().getCommonManager();  
  30. //              }else if(type==CustomerType.EXPRESS){  
  31. //                  NumberMachine.getInstance().getExpressManager();  
  32. //              }else if(type==CustomerType.VIP){  
  33. //                  NumberMachine.getInstance().getVipManager();  
  34. //              }  
  35.                   
  36.                   
  37.                 //因爲switch()case要比if()else效率高,所以用switch()case  
  38.                 switch(type){//不能用long型,String類型的,但可以用枚舉  
  39.                     case COMMON:  
  40.                         commonService();  
  41.                         break;  
  42.                     case EXPRESS:  
  43.                         expressService();  
  44.                         break;  
  45.                     case VIP:  
  46.                         vipService();  
  47.                         break;  
  48.                     default:break;  
  49.                 }  
  50.             }  
  51.         });  
  52.     }  
  53.     private void commonService() {  
  54.         String windowName="第"+windowId+"號"+type+"窗口";  
  55.         System.out.println(windowName+"正在獲取任務");  
  56.         Integer number=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();  
  57.         if(null!=number){  
  58.             System.out.println(windowName+"正爲第"+number+"個"+type+"客戶服務");  
  59.             long beginTime=System.currentTimeMillis();  
  60.             int maxServeTime=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;  
  61.             long serveTime=new Random().nextInt(maxServeTime)+1+Constants.MIN_SERVICE_TIME;  
  62.             try {  
  63.                 Thread.sleep(serveTime);  
  64.             } catch (InterruptedException e) {  
  65.                 e.printStackTrace();  
  66.             }  
  67.             long endTime=System.currentTimeMillis();  
  68.             long costTime=endTime-beginTime;  
  69.             System.out.println(windowName+"爲第"+number+"個"+type+"客戶完成服務,耗時"+costTime/1000+"秒");  
  70.         }else{  
  71.             System.out.println(windowName+"沒有取到任務,休息一秒鐘");  
  72.             try {  
  73.                 Thread.sleep(1000);  
  74.             } catch (InterruptedException e) {  
  75.                 e.printStackTrace();  
  76.             }  
  77.         }  
  78.     }  
  79.     private void expressService() {  
  80.         String windowName="第"+windowId+"號"+type+"窗口";  
  81.         System.out.println(windowName+"正在獲取任務");  
  82.         Integer number=NumberMachine.getInstance().getExpressManager().fetchServiceNumber();  
  83.         if(null!=number){  
  84.             System.out.println(windowName+"正爲第"+number+"個"+type+"客戶服務");  
  85.             long beginTime=System.currentTimeMillis();  
  86. //          int maxServeTime=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;  
  87. //          long serveTime=new Random().nextInt(maxServeTime)+1+Constants.MIN_SERVICE_TIME;  
  88.             try {  
  89. //              Thread.sleep(serveTime);  
  90.                 Thread.sleep(Constants.MIN_SERVICE_TIME);  
  91.             } catch (InterruptedException e) {  
  92.                 e.printStackTrace();  
  93.             }  
  94.             long endTime=System.currentTimeMillis();  
  95.             long costTime=endTime-beginTime;  
  96.             System.out.println(windowName+"爲第"+number+"個"+type+"客戶完成服務,耗時"+costTime/1000+"秒");  
  97.         }else{  
  98.             System.out.println(windowName+"沒有取到任務!");  
  99.             commonService();//調用普通服務  
  100.         }  
  101.     }  
  102.     private void vipService() {  
  103.         String windowName="第"+windowId+"號"+type+"窗口";  
  104.         System.out.println(windowName+"正在獲取任務");  
  105.         Integer number=NumberMachine.getInstance().getVipManager().fetchServiceNumber();  
  106.         if(null!=number){  
  107.             System.out.println(windowName+"正爲第"+number+"個"+type+"客戶服務");  
  108.             long beginTime=System.currentTimeMillis();  
  109.             int maxServeTime=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;  
  110.             long serveTime=new Random().nextInt(maxServeTime)+1+Constants.MIN_SERVICE_TIME;  
  111.             try {  
  112.                 Thread.sleep(serveTime);  
  113.             } catch (InterruptedException e) {  
  114.                 e.printStackTrace();  
  115.             }  
  116.             long endTime=System.currentTimeMillis();  
  117.             long costTime=endTime-beginTime;  
  118.             System.out.println(windowName+"爲第"+number+"個"+type+"客戶完成服務,耗時"+costTime/1000+"秒");  
  119.         }else{  
  120.             System.out.println(windowName+"沒有取到任務!");  
  121.             commonService();//調用普通服務  
  122.         }  
  123.     }  
  124. }  






用戶枚舉類

  1. package com.itcast.interview.bank;  
  2.   
  3. public enum CustomerType {  
  4.     COMMON,EXPRESS,VIP;  
  5.     public String toString(){  
  6.         switch(this){  
  7.             case COMMON:return "普通窗口";  
  8.             case EXPRESS:return "快速窗口";  
  9.             case VIP:return name();//直接返回枚舉的名稱,即"VIP"  
  10.         }   
  11.         return null;   
  12.     }  
  13. }  

時間類

  1. package com.itcast.interview.bank;  
  2.   
  3. public class Constants {  
  4.     public static int MAX_SERVICE_TIME=10000;  
  5.     public static int MIN_SERVICE_TIME=1000;  
  6.     public static int COMMON_CUSTOMER_INTERVAL_TIME=1;  
  7. }  

主方法運行類

  1. package com.itcast.interview.bank;  
  2.   
  3. import java.util.concurrent.Executors;  
  4. import java.util.concurrent.TimeUnit;  
  5.   
  6. public class MainClass {  
  7.     public static void main(String[] args) {  
  8.         for (int i = 0; i < 5; i++) {  
  9.             ServiceWindow commonWindow=new ServiceWindow();  
  10.             commonWindow.setWindowId(i);  
  11.             commonWindow.start();  
  12.         }  
  13.         ServiceWindow vipWindow=new ServiceWindow();  
  14.         vipWindow.setWindowId(1);//不寫的話,默認的也是1  
  15.         vipWindow.setCustomerType(CustomerType.VIP);  
  16.         vipWindow.start();  
  17.           
  18.         ServiceWindow expressWindow1=new ServiceWindow();  
  19.         expressWindow1.setWindowId(1);//不寫的話,默認的也是1  
  20.         expressWindow1.setCustomerType(CustomerType.EXPRESS);  
  21.         expressWindow1.start();  
  22.           
  23.         //vip客戶  
  24.         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){  
  25.             public void run(){  
  26.                 Integer number=NumberMachine.getInstance().getVipManager().generateNewManager();  
  27.                 System.out.println(number+"號vip客戶等待服務!");  
  28.             }  
  29.         },   
  30.         2,//隔多長時間開始執行  
  31.         Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,//每隔多長時間執行一次  
  32.         TimeUnit.SECONDS);  
  33.           
  34.         //普通客戶  
  35.         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){  
  36.             public void run(){  
  37.                 Integer number=NumberMachine.getInstance().getCommonManager().generateNewManager();  
  38.                 System.out.println(number+"號普通客戶等待服務!");  
  39.             }  
  40.         },   
  41.         2,//隔多長時間開始執行  
  42.         Constants.COMMON_CUSTOMER_INTERVAL_TIME,//每隔多長時間執行一次  
  43.         TimeUnit.SECONDS);  
  44.           
  45.         //快速客戶  
  46.         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){  
  47.             public void run(){  
  48.                 Integer number=NumberMachine.getInstance().getExpressManager().generateNewManager();  
  49.                 System.out.println(number+"號vip客戶等待服務!");     
  50.             }  
  51.         },   
  52.         2,//隔多長時間開始執行  
  53.         Constants.COMMON_CUSTOMER_INTERVAL_TIME*2,//每隔多長時間執行一次  
  54.         TimeUnit.SECONDS);  
  55.     }  
  56. }  



                                          ----------------------    android培訓    java培訓   期待與您交流!    ----------------------   
                         詳細請查看      http://edu.csdn.net/heima
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章