黑马程序员-银行调度管理系统

 一、产生排序号码():
   首先、初始第一个排队号码为1.定义LastNumber(int)用于接收上一个号码,然后每有一个客户过来点击取号,那么此时现在的号码将会是Lastnumber++.这样就完成了为客户产生号码的模块。

   其次、产生的号码都需要一个空间把它们存起来,所以这里可以定义一个集合把他们存起来。每产生一个号码,只需往数组中add(LastNumber).

   最后、窗口服务员按照先来后到的顺序为客户服务,所以可以看作是从集合中取走一个元素。remove(0)--每次取走的都是集合中的第一个元素。

   **产生号码和服务员获取号码,最好定义返回类型为Integer。因为remove(0),一旦没有号码,而服务员**要获取号码,将会报空指针异常,所以最好返回类型为Integer。


  二、管理号码:
   首先、创建3个产生号码的对象,分别为普通客户(commandManager)、快速客户(expressManager)、VIP客户(vipManager),并生成获取对象方法。

   其次、因为这个管理号码类的对象在系统中只存在一个,所以这里要生成一个单例模式。
   private NumberMachine(){}
   public static NumberMachine getInstance(){return instance}
   private static NumberMachine instance = new NumberMachine();

  三、创建服务窗口:
   首先、创建一个线程来管理服务。在线程中获取号码,但是由于在NumberMachine中创建了三个不同的对象(普通、快速、VIP)。所以我们必须要有三种假设,如果是普通窗口,那么获取普通窗口的号码;如果是快速窗口,优先获取快速客户的号码,若空闲则获取普通客户号码;如果是VIP窗口,优先获取VIP客户的号码,若空闲则获取普通客户的号码;但是为了显得专业一些,所以这里可以定义一个枚举(CustomerType type),可以把这三种假设作为枚举中的三个元素。同时为了更好的提醒,所以枚举最好覆盖toString()方法。

   其次,因为每一种服务有可能有多个服务窗口,所以要定义一个变量windowId来指定。为了展现更好的灵活性,把windowId与type生成set方法,这样就方便后期的调用了。

   Integer number= NumberMachine.getInstance().getCommandManager().fecthNumber();//获取普通客户号码

   接着:获取号码也要进行判断,因为有可能获取不到号码。一旦获取到号码之后就要进行服务了。
    1、要计算服务时间,可以另外创建一个类用于专门存储最大服务时间和最小服务时间值。服务时间在最大服务时间值与最小服务时间值的和产生,
    int MaxRand = Constants.MAX_SERVICETIME-Constants.MIN_SERVICETIME; //10000-1000=9000
    Thread.sleep(new Random().nextInt(MaxRand)+1+Constants.MIN_SERVICETIME);//随机产生服务时间
    
    此服务总耗时由获取号码开始到服务完毕。为此可以在获取号码后,记下当前系统时间,由服务完毕后的系统时间减去服务开始的时间,即为服务总耗时(除以1000,才能得到秒,以为系统时间是毫秒。)。这里的玄机就在于如何获取服务时间,因为这是随机产生的,而且要在一定的范围内,是要规定边界的,所以有点难度。

    2、如果没有获取到号码,休息1秒后继续获取(Thread.sleep(1000););若是VIP窗口,要获取普通客户号码,若是快速窗口,也要获取普通客户号码,知道都没有普通客户号码了,才能休息。
  
  四、创建MainClass,开始初步测试
   首先、实例化创建窗口。

   其次、使用1.5后的线程技术来管理服务。
    Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(
    new Runnable(){
     @Override
     public void run() {
      int number = NumberMachine.getInstance().getCommandManager().generateNewManager();
      System.out.println("第"+number+"号普通客户正在等待服务!");
     }
    },
    0,
    Constants.time,
    TimeUnit.SECONDS
    );
   细节一、这里编得不够严谨,因为如果没有存在号码,那么窗口是取不走号码,所以一直会打印xxx窗口正在等待服务。
   public synchronized Integer fecthNumber(){
    Integer number  = null;
    if(queueNumber.size()>0){
     number = queueNumber.remove(0); //窗口的业务员把最先产生的号码拿走
    }
    return number; 
   }
   细节二、由于要求普通客户:vip客户:快速客户为6:1:3
    这里我们可以通过线程的定时装置的时间设置类设置号码的产出时间。
    普通客户:1秒中来一个人
    VIP窗口:6秒来一个人
    快速客户:2秒中来一个人

这份视频看得我心血澎湃,明白思路之后,我也试着做了一遍。虽然依然生疏,但是我坚信要熟悉,只是时间问题。只要明白了原理,只要有了思想,一切事物的熟悉只是时间问题。不过既然选择了这条路,就必须坚定不移的走下去。因为:革命尚未开始,绝不能退缩!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值