面试题之银行调度


银行业务调度

      第一步:创建一个号码管理器

                   publicclass NumberManager {

                            //号码管理器

                            privateint lastNumber  = 1;

                            //排队队列

                            privateList<Integer> queueNumber = new ArrayList<Integer>();

                            //产生新的号码

                            //由于是多个线程操作同一个数据必须加上互斥锁

                            publicsynchronized Integer generateManager(){

                                     queueNumber.add(lastNumber);

                                     returnlastNumber++;

                            }

                            //窗口取号码的方法

                            publicsynchronized Integer fetchServiceNumber(){

                                     //避免空指针异常

                                     Integernumber = null;

                                     if(queueNumber.size()>0){

                                               number= queueNumber.remove(0);

                                     }

                                     returnnumber;

                            }

                   }

      第二步:创建一个号码机器,生成号码管理器

                   publicclass NumberMachine {

                            //号码产生器,产生三个号码管理器

                            privateNumberManager commanManager = new NumberManager();

                            privateNumberManager expressManager = new NumberManager();

                            privateNumberManager vipManager = new NumberManager();

                            publicNumberManager getCommanManager() {

                                     returncommanManager;

                            }

                            publicNumberManager getExpressManager() {

                                     returnexpressManager;

                            }

                            publicNumberManager getVipManager() {

                                     return vipManager;

                            }

                           

                            //由于只有一个机器,用单例模式,饿汉式

                            privateNumberMachine(){};

                            publicstatic NumberMachine getInstance(){

                                     returnnumberMachine;

                            }

                            privatestatic NumberMachine numberMachine = new NumberMachine();

                   }

      第三步:创建窗口

                   publicclass ServieWindow {

                            //服务窗口

                            //窗口类型使用枚举

                            privateCustomType type = CustomType.COMMON;

                            //定义窗口号

                            privateint windowId = 1;

                           

                            publicvoid setType(CustomType type) {

                                     this.type= type;

                            }

 

                            publicvoid setWindowId(int windowId) {

                                     this.windowId= windowId;

                            }

 

                            //开始叫号

                            publicvoid start(){

                                     //该窗口使用多线程来循环叫号

                                     //使用线程池创建

                                     Executors.newSingleThreadExecutor().execute(

                                                        newRunnable(){

                                                                 publicvoid run(){

                                                                           while(true){

                                                                                    //根据窗口类型取号

                                                                                    switch(type){

                                                                                             caseCOMMON:

                                                                                             commonService();

                                                                                                       break;

                                                                                             caseEXPRESS:

                                                                                                       expressService();

                                                                                                       break;

                                                                                             caseVIP:

                                                                                                       vipService();

                                                                                                       break;

                                                                                            

                                                                                    }

                                                                           }

                                                                                   

                                                                 }

                                                        }

                                                        );

                            }

 

                            privatevoid commonService() {

                                     StringwindowName = ""+windowId+""+type+"窗口";

                                     Integernumber = NumberMachine.getInstance().getCommanManager().fetchServiceNumber();

                                     System.out.println(windowName+"正在获取服务");

                                     if(number != null){

                                               System.out.println(windowName+ "为第" + number+""+type+"客户服务");

                                               //服务时间

                                               longbeginTime = System.currentTimeMillis();

                                               intMaxRand = Constants.MaxService_TIME-Constants.MinService_TIME;

                                               //获得服务时间

                                               longserverTime = new Random().nextInt(MaxRand)+1+Constants.MinService_TIME;

                                               try{

                                                        Thread.sleep(serverTime);

                                               }catch (InterruptedException e) {

                                                        //TODO Auto-generated catch block

                                                        e.printStackTrace();

                                               }

                                               longcostTime = System.currentTimeMillis()-beginTime;

                                               System.out.println(windowName+ "为第" + number+""+"普通"+"客户服务,花费时间+"+costTime/1000+"");

                                     }else{

                                               System.out.println(windowName+"没有取到服务任务,先吸支烟!");

                                               try{

                                                        Thread.sleep(1000);

                                               }catch (InterruptedException e) {

                                                        //TODO Auto-generated catch block

                                                        e.printStackTrace();

                                               }

                                     }

                            }

                            privatevoid expressService() {

                                     StringwindowName = ""+windowId+""+type+"窗口";

                                     Integernumber = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();

                                     System.out.println(windowName+"正在获取服务");

                                     if(number!= null){

                                               System.out.println(windowName+ "为第" + number+""+type+"客户服务");

                                               //服务时间

                                               longbeginTime = System.currentTimeMillis();

                                               //intMaxRand = Constants.MaxService_TIME-Constants.MinService_TIME;

                                               //获得服务时间

                                               //longserverTime = new Random().nextInt(MaxRand)+1+Constants.MinService_TIME;

                                               try{

                                                        Thread.sleep(Constants.MinService_TIME);

                                               }catch (InterruptedException e) {

                                                        //TODO Auto-generated catch block

                                                        e.printStackTrace();

                                               }

                                               longcostTime = System.currentTimeMillis()-beginTime;

                                               System.out.println(windowName+ "为第" + number+""+type+"客户服务,花费时间+"+costTime/1000+"");

                                     }else{

                                               System.out.println(windowName+ "没有取到服务任务!");

                                               commonService();

                                     }

                            }

                            privatevoid vipService() {

                                     StringwindowName = ""+windowId+""+type+"窗口";

                                     Integernumber = NumberMachine.getInstance().getVipManager().fetchServiceNumber();

                                     System.out.println(windowName+"正在获取服务");

                                     if(number!= null){

                                               System.out.println(windowName+ "为第" + number+""+type+"客户服务");

                                               //服务时间

                                               longbeginTime = System.currentTimeMillis();

                                               intMaxRand = Constants.MaxService_TIME-Constants.MinService_TIME;

                                               //获得服务时间

                                              long serverTime = newRandom().nextInt(MaxRand)+1+Constants.MinService_TIME;

                                               try{

                                                        Thread.sleep(serverTime);

                                               }catch (InterruptedException e) {

                                                        //TODO Auto-generated catch block

                                                        e.printStackTrace();

                                               }

                                               longcostTime = System.currentTimeMillis()-beginTime;

                                               System.out.println(windowName+ "为第" + number+""+type+"客户服务,花费时间+"+costTime/1000+"");

                                     }else{

                                               System.out.println(windowName+ "没有取到服务任务!");

                                               commonService();

                                     }

                            }

                           

                   }

      第四步:测试

                                     publicstatic void main(String[] args) {

                                     for(inti = 1;i<5;i++){

                                               ServieWindowcommonWindow = new ServieWindow();

                                               commonWindow.setWindowId(i);

                                               commonWindow.start();

                                     }

                                     ServieWindowexpressWindow = new ServieWindow();

                                     expressWindow.setType(CustomType.EXPRESS);

                                     expressWindow.start();

                                     ServieWindowvipWindow = new ServieWindow();

                                     vipWindow.setType(CustomType.VIP);

                                     vipWindow.start();

                                     //创建一个调度线程池

                                     Executors.newScheduledThreadPool(1).scheduleAtFixedRate(

                                                        newRunnable(){

                                                                 publicvoid run(){

                                                                           //普通窗口控制

                                                                           //取号

                                                                           Integernumber = NumberMachine.getInstance().getCommanManager().generateManager();

                                                                           System.out.println(number+ "号普通客户等待服务");

                                                                          

                                                                 }

                                                                

                                                        },

                                                        0,

                                                        Constants.COMMON_CUSTOMER_INTERVAL_TIME,

                                                        TimeUnit.SECONDS);

                                     Executors.newScheduledThreadPool(1).scheduleAtFixedRate(

                                                        newRunnable(){

                                                                 publicvoid run(){

                                                                           //快速窗口控制

                                                                           Integernumber = NumberMachine.getInstance().getExpressManager().generateManager();

                                                                           System.out.println(number+ "号快速客户等待服务");

                                                                 }

                                                                

                                                        },

                                                        0,

                                                        Constants.COMMON_CUSTOMER_INTERVAL_TIME*2,

                                                        TimeUnit.SECONDS);

                                     Executors.newScheduledThreadPool(1).scheduleAtFixedRate(

                                                        newRunnable(){

                                                                 publicvoid run(){

                                                                           //vip窗口控制

                                                                           Integernumber = NumberMachine.getInstance().getVipManager().generateManager();

                                                                           System.out.println(number+ "vip客户等待服务");

                                                                 }

                                                                

                                                        },

                                                        0,

                                                        Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,

                                                        TimeUnit.SECONDS);

 

                            }

 

 

                   }

      第五步:一般把静态常数封装成类,以及一些类

                   publicclass Constants {

                            publicstatic int MaxService_TIME = 10000;

                            publicstatic int MinService_TIME = 1000;

                            publicstatic int COMMON_CUSTOMER_INTERVAL_TIME = 1;

                   }

                  

                   publicenum CustomType {

                            COMMON,EXPRESS,VIP;

                            publicString toString(){

                                     switch(this){

                                     caseCOMMON:

                                               return"普通";

                                     caseEXPRESS:

                                               return"快速";

                                     caseVIP:

                                               returnname();

                                     }

                                     returnnull;

                            }

                   }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值