黑馬程序員——銀行業務調度系統邏輯

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

 

銀行業務調度邏輯,此問題稍微有複雜,需要根據實際情況將思路整理清晰

窗口

1普通窗口:四個普通窗口,給普通客戶辦理業務,設置一個時間區域,每個客戶辦理業務需要花費的時間是隨即的分佈於這個區域。

2快速窗口:(1)辦理正常的快速業務。

                     (2)如果空閒,普通客戶正在排隊時,辦理普通客戶業務。

3VIP窗口:(1)辦理VIP客戶業務。

                      (2)如果空閒,普通客戶正在排隊時,辦理普通客戶業務。

 

需要三個號碼控制器器爲這三種類型的客戶順序產生號碼。

一個管理機管理這三個號碼控制器。

確定對象:

(1)窗口

(2)號碼控制器

(3)管理機

(4)客戶

 

這樣就明確了整個業務流程,管理機管理控制器,控制器產生號碼,窗口爲相應的客戶服務。

CustomerType根據需要,可以判定得使用枚舉類型。

NumberManager號碼控制器,有兩個方法一個是產生號碼,一個是得到當前號碼,刪掉。

NumberMachine管理機,控制三個號碼控制器,使用set方法。需要用到單利設計模式。

ServiceWindow窗口服務,三個方法,對應三種類型客戶。

 

/號碼管理器

publicclass NumberManager {

   

    privateintlastNumber=1;

    //排隊序列

    private List<Integer>queueNumber =new ArrayList<Integer>();

    //產生號碼

    //兩個線程訪問相同的數據,容易產生死鎖

    publicsynchronized Integer generateNewManager(){

       queueNumber.add(lastNumber);

       returnlastNumber++;

    }

    //取號碼

    publicsynchronized Integer fetchServiceNumber(){

    Integer number =null;

    if(queueNumber.size()>0){

    returnqueueNumber.remove(0);

    }

    return number;

    }

號碼管理機

publicclass NumberMachine {

    private NumberManagercommonManager =new NumberManager();

    private NumberManagerexpressManager =new NumberManager();

    private NumberManagervipManager =new NumberManager();

    public NumberManager getCommonManager() {

       returncommonManager;

    }

    public NumberManager getExpressManager() {

       returnexpressManager;

    }

    public NumberManager getVipManager() {

       returnvipManager;

    }

    //單例設計模式,構造方法私有化,創建對象,獲取對象

    private NumberMachine(){}

    publicstatic NumberMachine getInstance(){

       returninstance;

    }

    privatestatic NumberMachineinstance =new NumberMachine();

}

 

 CustomerType客戶類型

publicenumCustomerType {

    COMMON,EXPRESS,VIP;

    public String toString(){

       switch(this){

       caseCOMMON:

           return"普通";

       caseEXPRESS:

           return"快速";

       caseVIP:

           //枚舉的name方法就是返回枚舉的名字

           return name();

          

       }

       returnnull;

    }

 

publicclassServiceWindow {

 

    private CustomerTypetype = CustomerType.COMMON;

    privateintwindowId = 1;

    publicvoid setType(CustomerType type) {

       this.type = type;

    }

    publicvoid setWindowId(int windowId) {

       this.windowId = windowId;

    }

    publicvoid start(){

       //線程池

       Executors.newSingleThreadExecutor().execute(new Runnable(){

           publicvoid run(){

              while(true){

                  switch(type){

                  caseCOMMON:

                     commonService();

                  break;

                  caseEXPRESS:

                     expressService();

                     break;

                  caseVIP:

                     vipService();

                     break;                  

                  }                                 

              }

                  //NumberMachine.getInstance().getCommonManager();

           }

       });

    }

    privatevoid commonService() {

       String windowName = ""+windowId+""+type+"窗口";

       Integer number= NumberMachine.getInstance().getCommonManager().fetchServiceNumber();;

       System.out.println(windowName+"正在獲取任務");

           if(number !=null){

              System.out.println(windowName +"爲第"+number+""+"普通"+"客戶服務");

           long beginTime=System.currentTimeMillis();

           int maxRand = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;        

           long serverTime =new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;

           try {

              Thread.sleep(serverTime);

           } catch (InterruptedException e) {

              e.printStackTrace();

           }

           long costTime = System.currentTimeMillis()-beginTime;

           System.out.println(windowName+""+number+""+"普通"+"客戶完成服務,耗時"+costTime/1000);

          

           }else{

           System.out.println(windowName+"沒有取到"+type+"服務任務,休息一秒");

           try {

              Thread.sleep(1000);

           } catch (InterruptedException e) {

              e.printStackTrace();

           }

          }

    }

    privatevoid expressService() {

       String windowName = ""+windowId+""+type+"窗口";

      

      

       Integer number= NumberMachine.getInstance().getExpressManager().fetchServiceNumber();;

       System.out.println(windowName+"正在獲取任務");

       if(number !=null){

              System.out.println(windowName +"爲第"+number+""+type+"客戶服務");

       long beginTime=System.currentTimeMillis();

       //int maxRand = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;

      

       //long serverTime = new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;

       try {

           Thread.sleep(Constants.MIN_SERVICE_TIME);

       } catch (InterruptedException e) {

           e.printStackTrace();

       }

       long costTime = System.currentTimeMillis()-beginTime;

       System.out.println(windowName+""+number+""+type+"客戶完成服務,耗時"+costTime/1000);

      

       }

       else{

       System.out.println(windowName+"沒有取到"+type+"服務任務");

       commonService();

      

      }

    }

 

    privatevoid vipService() {

       String windowName = ""+windowId+""+type+"窗口";

       Integer number= NumberMachine.getInstance().getVipManager().fetchServiceNumber();;

       System.out.println(windowName+"正在獲取VIP任務");

 

       if(number !=null){

           System.out.println(windowName +"爲第"+number+""+type+"客戶服務");

       long beginTime=System.currentTimeMillis();

       int maxRand = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;

      

       long serverTime =new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;

       try {

           Thread.sleep(serverTime);

       } catch (InterruptedException e) {

           e.printStackTrace();

       }

       long costTime = System.currentTimeMillis()-beginTime;

       System.out.println(windowName+""+number+""+type+"客戶完成服務,耗時"+costTime/1000);

      

       }else{

       System.out.println(windowName+"沒有取到"+type+"服務任務");

       commonService();

      }

    }

}

mainclass

publicclass MainClass {

 

    /**

     * @param args

     */

    publicstaticvoid 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();

     

     ServiceWindow vipWindow = new ServiceWindow();

     vipWindow.setType(CustomerType.VIP);

     vipWindow.start();

     

     Executors.newScheduledThreadPool(1).scheduleAtFixedRate(

             new Runnable(){

                publicvoid run(){

                   Integer number= NumberMachine.getInstance().getCommonManager().generateNewManager();

                   System.out.println(number+"普通客戶等待服務");

                }

                

             },

             0,

             Constants.COMMON_CUSTOMER_INTERVAL_TIME,

             TimeUnit.SECONDS

             );

          Executors.newScheduledThreadPool(1).scheduleAtFixedRate(

             new Runnable(){

                publicvoid run(){

                      Integer number= NumberMachine.getInstance().getExpressManager().generateNewManager();

                   System.out.println(number+"快速客戶等待服務");

                    

                }

                

             },

             0,

             Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2,

             TimeUnit.SECONDS

             );

          Executors.newScheduledThreadPool(1).scheduleAtFixedRate(

             new Runnable(){

                publicvoid run(){

                      Integer number= NumberMachine.getInstance().getVipManager().generateNewManager();

                   System.out.println(number+"VIP客戶等待服務");

                    

                }

                

             },

             0,

             Constants.COMMON_CUSTOMER_INTERVAL_TIME * 60,

             TimeUnit.SECONDS

             );

    }

 

}

 

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