面試題銀行業務調度系統實現


           

                                               銀行業務調度系統

 

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

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

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

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

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

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

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

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

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

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

用到的技術

1、面向對象的設計

2、線程池的使用

3、枚舉

4、單例設計模式

類中設計主要方法:NumberManager-----產號和取號

                                    NumberMachine------相當於銀行的自動取號機,單例設計,能夠產生3類不同的號

                  ServiceWindow-----相當於銀行的窗口,具有叫號,處理的功能

    主要代碼實現:

NumberManager

publicclassNumberManager {

    privateintlastNumber=0;

    List<Integer>queueNumbers=new ArrayList<Integer>();

    publicsynchronized Integer generateNumber(){

       queueNumbers.add(++lastNumber);

       returnlastNumber;

    }

    publicsynchronized Integer fetchNumber(){

       if(queueNumbers.size()>0)

           returnqueueNumbers.remove(0);

       else

           returnnull;

    }

}

NumberMachine:

package cn.itcast.bank;

publicclassNumberMachine {

    private NumberMachine(){}

    publicstaticNumberMachineinstance=newNumberMachine();

    publicstaticNumberMachine getInstance(){

       returninstance;

    }

    private NumberManagercommonManager=new NumberManager();

    private NumberManagerfastManager=new NumberManager();

    private NumberManagerVipManager=new NumberManager();

    public NumberManager getCommomManager(){

       returncommonManager;

    }

    public NumberManager getFastManager(){

       returnfastManager;

    }

    public NumberManager getVipManager(){

       returnVipManager;

    }

}

ServiceWindow

package cn.itcast.bank;

import java.util.Random;

import java.util.concurrent.Executors;

publicclassServiceWindow {

    private CustomerTypetype = CustomerType.COMMON;

    privateintnumber = 1;

    publicvoid setType(CustomerType type) {

       this.type = type;

    }

    publicvoid setNumber(int number) {

       this.number = number;

    }

    publicvoid start() {

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

           publicvoid run() {

              while (true) {

                  switch (type) {

                  caseCOMMON:

                     commonService();

                     break;

                  caseFAST:

                     fastService();

                     break;

                  caseVIP:

                     vipService();

                     break;

                  }

 

              }

 

           }

       });

    }

    privatevoid commonService() {

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

       System.out.println(windowName +"開始獲取普通任務");

       Integer serviceNumber = NumberMachine.getInstance().getCommomManager()

              .fetchNumber();

       if (serviceNumber !=null) {

           System.out.println(windowName +"開始爲" + serviceNumber +"號普通客戶服務");

           int time =new Random().nextInt(10) + 1;

           try {

 

              Thread.sleep(time);

           } catch (InterruptedException e) {

              e.printStackTrace();

           }

           System.out.println("完成對" + serviceNumber + "號普通客戶的服務,耗時" + time

                  + "");

       } else {

           System.out.println(windowName +"沒有獲取到普通任務,正在空閒一秒");

           try {

              Thread.sleep(1000);

           } catch (InterruptedException e) {

              e.printStackTrace();

           }

       }

    }

    privatevoid fastService() {

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

       System.out.println(windowName +"開始獲取快速任務");

       Integer serviceNumber = NumberMachine.getInstance().getFastManager()

              .fetchNumber();

       if (serviceNumber !=null) {

           System.out.println(windowName +"開始爲" + serviceNumber +"號快速客戶服務");

           int time =new Random().nextInt(5) + 1;

           try {

 

              Thread.sleep(time);

           } catch (InterruptedException e) {

              e.printStackTrace();

           }

           System.out.println("完成對" + serviceNumber + "號快速客戶的服務,耗時" + time

                  + "");

       } else {

           System.out.println(windowName +"沒有獲取到快速任務,正在準備獲取普通任務");

           commonService();

       }

 

    }

 

    privatevoid vipService() {

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

       System.out.println(windowName +"開始獲取vip任務");

       Integer serviceNumber = NumberMachine.getInstance().getCommomManager()

              .fetchNumber();

       if (serviceNumber !=null) {

           System.out.println(windowName +"開始爲" + serviceNumber +"vip客戶服務");

           int time =new Random().nextInt(8) + 1;

           try {

 

              Thread.sleep(time);

           } catch (InterruptedException e) {

              e.printStackTrace();

           }

           System.out.println("完成對" + serviceNumber + "vip客戶的服務,耗時" + time

                  + "");

       } else {

           System.out.println(windowName +"沒有獲取到vip任務,正在準備獲取普通任務");

           commonService();

       }

    }

}

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章