面试题银行业务调度系统实现


           

                                               银行业务调度系统

 

模拟实现银行业务调度系统逻辑,具体需求如下

Ø         银行内有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();

       }

    }

}

 


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