银行调度系统

主宰稳场 提交于 2020-02-27 09:31:52

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

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

对象分析:

1.窗口:
窗口:分三种类型,普通,vip,快速办理,用一个属性来标记他们
属性:类型,窗口号
方法:改变窗口号,改变类型办理业务

2.号码机器:
属性:类型
方法:生成号码

下面说明实例

1.用户类型:(CustomerType.java)

package com.zlc.bank;

publicenumCustomerType{

//用枚举表示出三种用户类型
    COMMON,EXPRESS,VIP;
    publicString toString()
    {
        switch(this)
        {
        case COMMON:return"普通";
        case EXPRESS:return"快速";
        case VIP:return"VIP";
        }
        returnnull;
    }

}

2.(NumberMachine.java)
//只能在某一时刻产生一个,应使用单例模式

package com.zlc.bank;

publicclassNumberMachine{
 privateNumberManager commonManager=newNumberManager();
    privateNumberManager expressManager=newNumberManager();
    privateNumberManager vipManager=newNumberManager();
    publicNumberManager getCommonManager(){
        return commonManager;
    }
    publicNumberManager getExpressManager(){
        return expressManager;
    }
    publicNumberManager getVipManager(){
        return vipManager;
    }
    privateNumberMachine()
    {
      
    }
    publicstaticNumberMachine instance=newNumberMachine();
    publicstaticNumberMachine getInstance()
    {
        return instance;
    }

}

3.办理业务使用到了多线程,可以将下面的代码抽象成一个方法

String windowName ="第"+ number +"号"+ type +"窗口";             
    System.out.println(windowName +"开始获取"+type"任务!");
    Integer serviceNumber =NumberMachine.getInstance().getCommonManager().fetchNumber();            
    if(serviceNumber !=null){
      System.out.println(windowName +"开始为第"+ serviceNumber +"号"+type+"客户服务");        
      int maxRandom =Constants.MAX_SERVICE_TIME -Constants.MIN_SERVICE_TIME;
      int serviceTime =newRandom().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME;
      try{
           Thread.sleep(serviceTime);
      }catch(InterruptedException e){
           e.printStackTrace();
      }     
      System.out.println(windowName +"完成为第"+ serviceNumber +type+"通客户服务,总共耗时"+ serviceTime/1000+"秒");             
    }else{
         System.out.println(windowName +"没有取到"+type+"任务,正在空闲一秒");            
         try{
              Thread.sleep(1000);
         }catch(InterruptedException e){
              e.printStackTrace();
         }                                 
    }


关于程序的原理和耦合之处:1、多线程生成一个号码就代表来了一个客户并存到一个集合之中2、开启三个多线程分别取出集合之中的数据,如果相应的的集合类型大小为0表示为没有人,如果大于0,减1,并休息(一定)随即的时间3、main方法中负责初始化窗口和开启三种类型的线程取号码,(如果,拥有cpu资源并执行)就取到号码那么就代表来人啦

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!