Java高新技术-银行调度系统-----黑马程序员

来源:互联网 发布:givens变换求矩阵分解 编辑:程序博客网 时间:2024/06/08 06:54

ASP.Net+Android+IOS开发------期待与您交流

 

<银行业务调度系统总结>

银行业务调度系统总结:


模拟实现银行业务调度系统逻辑,具体需求如下:
1.银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗k口。

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

3.异步随机生成各种类型的客户,生成各类型用户的概率比例为:
 VIP客户 :普通客户 :快速客户  =  1 :6 :3。

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

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

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

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

示意图如下:

 

实现步骤代码和解析:

1面向对象的分析与设计
 有三种对应类型的客户:VIP客户,普通客户,快速客户,异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次办理业务。
 1)首先,客户需要先取号。所以客户的类型是由取号机产生的。所有一个号码产生器对象,产生号码。
 2)由于有三类客户,每类客户都是独立产生的。就需要产生三个号码管理器对象各自管理一类用户的号码。并且这三个号码管理器统一由一个号码产生器进行管理。因为所有的号码都不可以重复。所以整个系统始终只能有一个号码产生器。所以要设计成单例。
2.实体设计
 NumberMachine类    号码产生器  -->产生三个号码管理器,且设置成单例
 产生三个号码管理器的方法
 1)getCommonManager()普通客户号码管理器
 2)getVipManager()VIP客户管理器
 3)getExpressManager()快速客户管理器
 当然还有一个产生实例对象的方法,getInstance()

 NumberManager类     号码管理器
 generateNewNumber() //产生新的客户号码
 fetchNumber() //即将要服务的号码

 ServiceWindow类   服务窗口
 方法:
 1)start()   //开始服务
 2)conmmonService() //普通客户服务
 3)expressService() //快速客户服务
 4)vipService() //Vip客户服务
3.细节代码
 1.NumberManager
  属性1:int lastNumber = 1;
  属性2:List queNumber -->让需要服务的客户进行排队,先到先服务。
  方法1:generateNewManager()
  方法2:fetchServiceNumber()
 2.NumberMachine -->单例
  属性:三个号码管理器commonManager()
        expressManager()
        vipManager()
   并且提供get方法。
 3.ServiceWindow
  属性1: CustomerType type;//代表服务窗口的类型(普通、快速、VIP)
  属性2:windowId = 1; //窗口号
  方法:star()--->开启线程
   Executors.newSingleThreadExecutor().execute(new Runnable(){
    public void run(){
     //实现取号
     while(true){
      
      1.判断客户类型,产生对应号码管理器
      2.叫号
       如果叫号成功,需要知道处理完成的耗时。Thread.sleep(serveTime);serveTime有一个最大值和最小值,重新定义一个类用来记住常量。
       如果不成功,休息1秒钟。

     }
    }
   });
 普通窗口如果没有接到任务就休息1秒,快速窗口和VIP则继续接受普通任务,还没接到就休息1秒
 4.CustomerType  Enum类型
  COMMON,EXPRESS,VIP
 5.Constants 类  --常量
 MAX_SERVICE_TIME=10000,MIN_SERVICE_TIME=1000
 6.main函数
 Executors.newSchduledThreadPool(1).scheduleAtFixedRate(
 new Runnable() {
  //执行的事件
 },
 经过多长时间,
 每隔多长时间,
 时间单位
 );
附:普通客户服务方法代码:
  

private void commonService() {  Integer num = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();  System.out.println("第"+windowId+"号"+ type +"窗口正在获取普通任务...");   if(num!=null){    long beginTime = System.currentTimeMillis();    int maxServeTime = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;    long serveTime = new Random().nextInt(maxServeTime)+1+Constants.MIN_SERVICE_TIME;    try {     Thread.sleep(serveTime);    } catch (InterruptedException e) {     e.printStackTrace();    }    long endTime = System.currentTimeMillis();    long costTime = endTime - beginTime;    System.out.println("第"+windowId+"号"+ type +"窗口为第"+num+"号普通客户完成服务,耗时"+costTime/1000+"秒");   }else{    System.out.println("第"+windowId+"号"+ type +"窗口没有获取到普通任务,先休息1秒");    try {     Thread.sleep(1000);    } catch (InterruptedException e) {     e.printStackTrace();    }   } }



 快速客户服务方法代码:
  

private void expressService() {  Integer num = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();  System.out.println("第"+windowId+"号"+ type +"窗口正在获取快速任务...");   if(num!=null){    long beginTime = System.currentTimeMillis();    long serveTime =Constants.MIN_SERVICE_TIME;    try {     Thread.sleep(serveTime);    } catch (InterruptedException e) {     e.printStackTrace();    }    long endTime = System.currentTimeMillis();    long costTime = endTime - beginTime;    System.out.println("第"+windowId+"号"+ type +"窗口为第"+num+"号快速客户完成服务,耗时"+costTime/1000+"秒");   }else{    System.out.println("第"+windowId+"号"+ type +"窗口没有获取到快速任务");    commonService();   } }


ASP.Net+Android+IOS开发------期待与您交流

 详细请查看:http://edu.csdn.net

原创粉丝点击