[黑马程序员]--银行管理系统

来源:互联网 发布:会计从业题库软件 编辑:程序博客网 时间:2024/05/22 14:13

------- android培训、java培训、期待与您交流! ----------

 

1,首先分析需求

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

 

Ø  银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。

 

Ø  有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。

 

Ø  异步随机生成各种类型的客户,生成各类型用户的概率比例为:

 

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

 

Ø  客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。

 

Ø  各类型客户在其对应窗口按顺序依次办理业务。

 

Ø  当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。

 

Ø  随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。

 

Ø  不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。


2. 将程序的框架架起来


 

|--Constants: 产生时间的静态方法

程序如下:

 public class Constants {  public static int MAX_SERVICE_TIME = 10000; //10秒!  public static int MIN_SERVICE_TIME = 1000; //1秒!    /*每个普通窗口服务一个客户的平均时间为5秒,一共有4个这样的窗口,也就是说银行的所有普通窗口合起来   * 平均1.25秒内可以服务完一个普通客户,再加上快速窗口和VIP窗口也可以服务普通客户,所以,   * 1秒钟产生一个普通客户比较合理,*/  public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;  }

|--主程序Bank_Queue的任务:1,产生3种窗口;2,三种客户来拿号

程序如下:

    //产生4个普通窗口    for(int i=1;i<5;i++){     ServiceWindow window =  new ServiceWindow();     window.setNumber(i);     window.start();    }     //产生1个快速窗口    ServiceWindow expressWindow =  new ServiceWindow();    expressWindow.setType(CustomerType.EXPRESS);    expressWindow.start();       //产生1个VIP窗口      ServiceWindow vipWindow =  new ServiceWindow();    vipWindow.setType(CustomerType.VIP);    vipWindow.start();         //普通客户拿号    Executors.newScheduledThreadPool(1).scheduleAtFixedRate(       new Runnable(){         public void run(){          Integer serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewNumber();                   //logger.info("第" + serviceNumber + "号普通客户正在等待服务!");          System.out.println("第" + serviceNumber + "号普通客户正在等待服务!");                 }       },       0,       Constants.COMMON_CUSTOMER_INTERVAL_TIME,       TimeUnit.SECONDS);       //快速客户拿号    Executors.newScheduledThreadPool(1).scheduleAtFixedRate(       new Runnable(){         public void run(){          Integer serviceNumber = NumberMachine.getInstance().getExpressManager().generateNewNumber();          System.out.println("第" + serviceNumber + "号快速客户正在等待服务!");         }       },       0,       Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2,       TimeUnit.SECONDS);       //VIP客户拿号    Executors.newScheduledThreadPool(1).scheduleAtFixedRate(       new Runnable(){         public void run(){          Integer serviceNumber = NumberMachine.getInstance().getVipManager().generateNewNumber();          System.out.println("第" + serviceNumber + "号VIP客户正在等待服务!");         }       },       0,       Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6,       TimeUnit.SECONDS);  }


|--枚举Customer Type的任务: 产生3种客户

程序如下:

  public String toString(){    String name = null;    switch(this){    case COMMON:     name = "普通";     break;    case EXPRESS:     name = "快速";     break;    case VIP:     name = name();     break;    }    return name;  }
  

|-- Service Window的任务: 1,设置窗口号 ;2,设置窗口类型;3,设置线程方法

程序如下:

public class ServiceWindow {private static Logger logger = Logger.getLogger("cn.itcast.bankqueue");private CustomerType type = CustomerType.COMMON;private int number = 1;public CustomerType getType() {return type;}public void setType(CustomerType type) {this.type = type;}public void setNumber(int number){this.number = number;}public void start(){Executors.newSingleThreadExecutor().execute(new Runnable(){public void run(){//下面这种写法的运行效率低,最好是把while放在case下面while(true){switch(type){case COMMON:commonService();break;case EXPRESS:expressService();break;case VIP:vipService();break;}}}});}private void commonService(){String windowName = "第" + number + "号" + type + "窗口";System.out.println(windowName + "开始获取普通任务!");Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchNumber();if(serviceNumber != null ){System.out.println(windowName + "开始为第" + serviceNumber + "号普通客户服务");int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME;try {Thread.sleep(serviceTime);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(windowName + "完成为第" + serviceNumber + "号普通客户服务,总共耗时" + serviceTime/1000 + "秒");}else{System.out.println(windowName + "没有取到普通任务,正在空闲一秒");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}private void expressService(){Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber();String windowName = "第" + number + "号" + type + "窗口";System.out.println(windowName + "开始获取快速任务!");if(serviceNumber !=null){System.out.println(windowName + "开始为第" + serviceNumber + "号快速客户服务");int serviceTime = Constants.MIN_SERVICE_TIME;try {Thread.sleep(serviceTime);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(windowName + "完成为第" + serviceNumber + "号快速客户服务,总共耗时" + serviceTime/1000 + "秒");}else{System.out.println(windowName + "没有取到快速任务!");commonService();}}private void vipService(){Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber();String windowName = "第" + number + "号" + type + "窗口";System.out.println(windowName + "开始获取VIP任务!");if(serviceNumber !=null){System.out.println(windowName + "开始为第" + serviceNumber + "号VIP客户服务");int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME;try {Thread.sleep(serviceTime);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(windowName + "完成为第" + serviceNumber + "号VIP客户服务,总共耗时" + serviceTime/1000 + "秒");}else{System.out.println(windowName + "没有取到VIP任务!");commonService();}}}


运行结构如下:


第1号普通窗口开始获取普通任务!
第1号普通窗口没有取到普通任务,正在空闲一秒
第2号普通窗口开始获取普通任务!
第2号普通窗口没有取到普通任务,正在空闲一秒
第3号普通窗口开始获取普通任务!
第3号普通窗口没有取到普通任务,正在空闲一秒
第4号普通窗口开始获取普通任务!
第4号普通窗口没有取到普通任务,正在空闲一秒
第1号快速窗口开始获取快速任务!
第1号快速窗口没有取到快速任务!
第1号快速窗口开始获取普通任务!
第1号快速窗口没有取到普通任务,正在空闲一秒
第1号VIP窗口开始获取VIP任务!
第1号VIP窗口没有取到VIP任务!
第1号VIP窗口开始获取普通任务!
第1号VIP窗口没有取到普通任务,正在空闲一秒
第1号普通客户正在等待服务!
第1号快速客户正在等待服务!
第1号VIP客户正在等待服务!
第1号普通窗口开始获取普通任务!
第1号普通窗口开始为第1号普通客户服务
第2号普通窗口开始获取普通任务!
第2号普通窗口没有取到普通任务,正在空闲一秒
第3号普通窗口开始获取普通任务!
第3号普通窗口没有取到普通任务,正在空闲一秒
第4号普通窗口开始获取普通任务!
第4号普通窗口没有取到普通任务,正在空闲一秒
第1号快速窗口开始获取快速任务!
第1号快速窗口开始为第1号快速客户服务
第1号VIP窗口开始获取VIP任务!
第1号VIP窗口开始为第1号VIP客户服务
第2号普通客户正在等待服务!
第2号普通窗口开始获取普通任务!
第2号普通窗口开始为第2号普通客户服务
第3号普通窗口开始获取普通任务!
第3号普通窗口没有取到普通任务,正在空闲一秒
第4号普通窗口开始获取普通任务!
第4号普通窗口没有取到普通任务,正在空闲一秒
第1号快速窗口完成为第1号快速客户服务,总共耗时1秒
第1号快速窗口开始获取快速任务!
第1号快速窗口没有取到快速任务!
第1号快速窗口开始获取普通任务!
第1号快速窗口没有取到普通任务,正在空闲一秒
第3号普通客户正在等待服务!
第2号快速客户正在等待服务!
第3号普通窗口开始获取普通任务!
第3号普通窗口开始为第3号普通客户服务
第4号普通窗口开始获取普通任务!
第4号普通窗口没有取到普通任务,正在空闲一秒
第1号快速窗口开始获取快速任务!
第1号快速窗口开始为第2号快速客户服务
第4号普通客户正在等待服务!
第1号VIP窗口完成为第1号VIP客户服务,总共耗时2秒
第1号VIP窗口开始获取VIP任务!
第1号VIP窗口没有取到VIP任务!
第1号VIP窗口开始获取普通任务!
第1号VIP窗口开始为第4号普通客户服务
第4号普通窗口开始获取普通任务!
第4号普通窗口没有取到普通任务,正在空闲一秒
第1号快速窗口完成为第2号快速客户服务,总共耗时1秒
第1号快速窗口开始获取快速任务!
第1号快速窗口没有取到快速任务!
第1号快速窗口开始获取普通任务!
第1号快速窗口没有取到普通任务,正在空闲一秒
第5号普通客户正在等待服务!
第3号快速客户正在等待服务!
第4号普通窗口开始获取普通任务!
第4号普通窗口开始为第5号普通客户服务
第1号快速窗口开始获取快速任务!
第1号快速窗口开始为第3号快速客户服务




原创粉丝点击