黑马程序员_7k面试题之银行业务调度系统

时间:2023-02-18 11:39:24

---------------------- ASP.Net+Android+IOS开发href="http://edu.csdn.net"target="blank">.Net培训、期待与您交流! ----------------------

1、项目需求:

银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
异步随机生成各种类型的客户,生成各类型用户的概率比例为:
        VIP客户 :普通客户 :快速客户  =  1 :6 :3。
客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需
的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
各类型客户在其对应窗口按顺序依次办理业务。 
当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户
的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

2、用面向对象的思想分析

1)客户,共有3类,用枚举的方法定义。

2)号码控制器,因为有顺序,所以用ArrayList集合存储号码,其内部具有产生新号码和获取等待号码的功能。

3)产生小票的机器,一台机器,设计成单例,其内部拥有三类客户的号码控制器,对外提供的只有该机器,而看不见内部的号码控制器。

4)服务窗口,获取号码控制器中等待的用户,普通窗口只服务于普通用户,快速窗口和vip窗口当没有相应类型的客户时,也可服务于普通用户。

5)最后,在主函数中控制三类客户产生的比例

3、程序部分代码:

1)号码控制器

[java] view plaincopy黑马程序员_7k面试题之银行业务调度系统黑马程序员_7k面试题之银行业务调度系统
  1. package ceshi.bank;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. //控制号码的产生与获取  
  6. public class NumberManager {  
  7.     private int lastNumber = 1;  
  8.     //定义集合,用于存储正在排队的号码  
  9.     private List<Integer> queueNumber = new ArrayList<Integer>();  
  10.     //用synchronized控制号码产生与获取的同步  
  11.     public synchronized Integer getNumber(){  
  12.         queueNumber.add(lastNumber);  
  13.         return lastNumber++;  
  14.     }  
  15.     public synchronized Integer fetchNumber(){  
  16.         Integer number = null;  
  17.         if(queueNumber.size()>0){  
  18.             number = queueNumber.remove(0);  
  19.         }  
  20.         return number;  
  21.     }  
  22. }  
2)号码总控机器
[java] view plaincopy黑马程序员_7k面试题之银行业务调度系统黑马程序员_7k面试题之银行业务调度系统
  1. package ceshi.bank;  
  2. //用单例设计号码总控器  
  3. public class NumberMachine {  
  4.     //分别创建三种号码管理器  
  5.     private NumberManager commonManager = new NumberManager();  
  6.     private NumberManager expressManager = new NumberManager();  
  7.     private NumberManager vipManager = new NumberManager();  
  8.     public NumberManager getCommonManager(){  
  9.         return commonManager;  
  10.     }  
  11.     public NumberManager getExpressManager(){  
  12.         return expressManager;  
  13.     }  
  14.     public NumberManager getVipManager(){  
  15.         return vipManager;  
  16.     }  
  17.     //用饿汉式写单例  
  18.     private NumberMachine(){}  
  19.     private static NumberMachine instance = new NumberMachine();  
  20.     public static NumberMachine getInstance(){  
  21.         return instance;  
  22.     }  
  23.       
  24. }  
3)服务窗口

[java] view plaincopy黑马程序员_7k面试题之银行业务调度系统黑马程序员_7k面试题之银行业务调度系统
  1. package ceshi.bank;  
  2.   
  3. import java.util.Random;  
  4. import java.util.concurrent.Executors;  
  5.   
  6. //服务窗口,用于获取正在等待服务  
  7. public class ServeWindow {  
  8.     private ConsumerType type = ConsumerType.COMMON;  
  9.     private int windowId = 1;  
  10.     //设置客户类型  
  11.     public void setType(ConsumerType type){  
  12.         this.type = type;  
  13.     }  
  14.     //设置窗口id  
  15.     public void setId(int windowId){  
  16.         this.windowId = windowId;  
  17.     }  
  18.     public void start(){  
  19.         Executors.newSingleThreadScheduledExecutor().execute(new Runnable(){  
  20.             public void run(){  
  21.                 while(true){  
  22.                     switch(type){  
  23.                     case COMMON:  
  24.                         commonService();  
  25.                         break;  
  26.                     case EXPRESS:  
  27.                         expressService();  
  28.                         break;  
  29.                     case VIP:  
  30.                         vipService();  
  31.                         break;  
  32.                     }  
  33.                 }  
  34.             }  
  35.         });  
  36.     }  
  37.     //对于普通窗口的服务  
  38.     public void commonService(){  
  39.         String windowName = "第"+windowId+"号"+type+"窗口";  
  40.         //获取等待的号码  
  41.         Integer num = NumberMachine.getInstance().getCommonManager().fetchNumber();  
  42.         System.out.println(windowName+"叫号...");  
  43.         if(num != null){  
  44.             System.out.println(windowName+"正在为第"+num+"号普通用户服务");  
  45.             long beginTime = System.currentTimeMillis();  
  46.             int maxRand =Constant.MAX_TIME-Constant.MIN_TIME;  
  47.             long serveTime = new Random().nextInt(maxRand)+1+Constant.MIN_TIME;  
  48.             try {  
  49.                 Thread.sleep(serveTime);  
  50.             } catch (InterruptedException e) {  
  51.                 // TODO Auto-generated catch block  
  52.                 e.printStackTrace();  
  53.             }  
  54.             long costTime = System.currentTimeMillis()-beginTime;  
  55.             //我觉得耗时这里应该用serveTime就可以了啊  
  56.             System.out.println(windowName+"为第"+num+"号普通用户服务完成,耗时"+costTime/1000+"秒");  
  57.         }else{  
  58.             System.out.println(windowName+"没有排队等候的普通用户,休息1s");  
  59.             try {  
  60.                 Thread.sleep(1000);  
  61.             } catch (InterruptedException e) {  
  62.                 // TODO Auto-generated catch block  
  63.                 e.printStackTrace();  
  64.             }  
  65.         }  
  66.     }  
  67.     //快速窗口的服务  
  68.     public void expressService(){  
  69.         String windowName = "第"+windowId+"号"+type+"窗口";  
  70.         Integer num = NumberMachine.getInstance().getCommonManager().fetchNumber();  
  71.         System.out.println(windowName+"叫号...");  
  72.         if(num != null){  
  73.             System.out.println(windowName+"正在为第"+num+"号"+type+"用户服务");  
  74.             long beginTime = System.currentTimeMillis();  
  75.             int maxRand =Constant.MAX_TIME-Constant.MIN_TIME;  
  76.             long serveTime = new Random().nextInt(maxRand)+1+Constant.MIN_TIME;  
  77.             try {  
  78.                 Thread.sleep(serveTime);  
  79.             } catch (InterruptedException e) {  
  80.                 // TODO Auto-generated catch block  
  81.                 e.printStackTrace();  
  82.             }  
  83.             long costTime = System.currentTimeMillis()-beginTime;  
  84.             System.out.println(windowName+"为第"+num+"号"+type+"用户服务完成,耗时"+costTime/1000+"秒");  
  85.         }else{  
  86.             System.out.println(windowName+"没有排队等候的"+type+"用户");  
  87.             commonService();  
  88.         }  
  89.     }  
  90.     //vip窗口的服务  
  91.     public void vipService(){  
  92.         String windowName = "第"+windowId+"号"+type+"窗口";  
  93.         Integer num = NumberMachine.getInstance().getCommonManager().fetchNumber();  
  94.         System.out.println(windowName+"叫号...");  
  95.         if(num != null){  
  96.             System.out.println(windowName+"正在为第"+num+"号"+type+"用户服务");  
  97.             long beginTime = System.currentTimeMillis();  
  98.             int maxRand =Constant.MAX_TIME-Constant.MIN_TIME;  
  99.             long serveTime = new Random().nextInt(maxRand)+1+Constant.MIN_TIME;  
  100.             try {  
  101.                 Thread.sleep(serveTime);  
  102.             } catch (InterruptedException e) {  
  103.                 // TODO Auto-generated catch block  
  104.                 e.printStackTrace();  
  105.             }  
  106.             long costTime = System.currentTimeMillis()-beginTime;  
  107.             System.out.println(windowName+"为第"+num+"号"+type+"用户服务完成,耗时"+costTime/1000+"秒");  
  108.         }else{  
  109.             System.out.println(windowName+"没有排队等候的"+type+"用户");  
  110.             commonService();  
  111.         }  
  112.     }  
  113. }  
4)主函数
[java] view plaincopy黑马程序员_7k面试题之银行业务调度系统黑马程序员_7k面试题之银行业务调度系统
  1. package ceshi.bank;  
  2.   
  3. import java.util.concurrent.Executors;  
  4. import java.util.concurrent.TimeUnit;  
  5.   
  6. public class Main {  
  7.   
  8.     public static void main(String[] args) {  
  9.         //产生4个普通窗口  
  10.         for(int i=1 ;i<5;i++){  
  11.             ServeWindow common = new ServeWindow();  
  12.             common.setId(i);  
  13.             common.start();  
  14.         }  
  15.         //产生1个快速窗口  
  16.         ServeWindow express = new ServeWindow();  
  17.         express.setType(ConsumerType.EXPRESS);;  
  18.         express.start();  
  19.         //产生一个vip窗口  
  20.         ServeWindow vip = new ServeWindow();  
  21.         vip.setType(ConsumerType.VIP);;  
  22.         vip.start();  
  23.         //定义线程用来产生普通客户  
  24.         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(  
  25.                 new Runnable(){  
  26.                     public void run(){  
  27.                         int num = NumberMachine.getInstance().getCommonManager().getNumber();  
  28.                         System.out.println("第"+num+"号普通客户等候服务");  
  29.                     }  
  30.                 },   
  31.                 0,  
  32.                 Constant.COMMON_CUSTOMER_INTERVAL_TIME,   
  33.                 TimeUnit.SECONDS);  
  34.         //定义线程用来产生快速客户  
  35.         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(  
  36.                 new Runnable(){  
  37.                     public void run(){  
  38.                         int num = NumberMachine.getInstance().getExpressManager().getNumber();  
  39.                         System.out.println("第"+num+"号快速客户等候服务");  
  40.                     }  
  41.                 },   
  42.                 0,  
  43.                 Constant.COMMON_CUSTOMER_INTERVAL_TIME*2,   
  44.                 TimeUnit.SECONDS);  
  45.         //定义线程用来产生vip客户  
  46.         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(  
  47.                 new Runnable(){  
  48.                     public void run(){  
  49.                         int num = NumberMachine.getInstance().getVipManager().getNumber();  
  50.                         System.out.println("第"+num+"号vip客户等候服务");  
  51.                     }  
  52.                 },   
  53.                 0,  
  54.                 Constant.COMMON_CUSTOMER_INTERVAL_TIME*6,   
  55.                 TimeUnit.SECONDS);  
  56.   
  57.     }  
  58.   
  59. }  


---------------------- ASP.Net+Android+IOS开发href="http://edu.csdn.net"target="blank">.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net