黑马程序员---银行调度系统总结

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

需求:
    1、银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
    2、有三种对应类型的客户:VIP客户,普通客户,快速客户。
    3、VIP客户以及普通客户办理业务所需的时间有最大值和最小值,快速客户办理业务所需时间为最小值,三种客户比例为VIP客户:普通客户:快速客户  =  1 :6 :3。
   4、当VIP窗口和快速窗口没有客户等待可以为普通客户服务。

系统分析:

首先来银行的客户分为三类:普通客户,快速客户,VIP客户,异步随机生成各种类型的客户,然后去相对应的窗口办理业务。每个类型的客户拿到的号码都是独立的,号码管理器进行管理就需要三个,这样用一个发号机器来管理三个号码管理器,客户领号时根据自己的类型选择不同的号码管理器取得号码,这样才更接近于现实。这时可以大致确定下几个类,客户类、号码管理器类、发号机器类。在客户来银行办理业务时,他是要等到业务窗口喊号才可以到窗口办理业务,而喊号的依据便是发号机器那里得到的已经发出去的号码。


package com.itcast.bank;

import java.util.*;


//号码产生器
public class NumberManager {

    private int lastNumber = 1;
    //定义一个集合 存储号码
    private List<Integer> queueNumber = new ArrayList<Integer>();
   
    //产生一个号码  
    public synchronized Integer generateNewManager()
    {
       queueNumber.add(lastNumber);
       //System.out.println(queueNumber.size()+"aaaaaaaaaaa");
       return lastNumber++;
    }
    //获取号码  
    public synchronized Integer fetchServiceNumber()
    {
       Integer number = null;
      
       if(queueNumber.size() >0)
          number = queueNumber.remove(0);  //从集合中获取 号码,取出一个删除一个
       //System.out.println(number+"bbbbbbbbbbbb");
       return number;
    }
   
   
}

//取号器
package cn.itheima.bank;

public class NumberMachine {
   
    private NumberManager commonManager = new NumberManager(); //产生一个普通号码
    private NumberManager expressManager = new NumberManager(); //产生一个快速号码
    private NumberManager vipManager = new NumberManager();   //产生一个vip号码
   
    public NumberManager getCommonManager() {
       return commonManager;
    }
    public NumberManager getExpressManager() {
       return expressManager;
    }
    public NumberManager getVipManager() {
       return vipManager;
    }
  
    private NumberMachine(){};
    // 要操作同一个号码产生器    所有采用单例模式
    private static NumberMachine numberMachine = new NumberMachine();
    public static NumberMachine getInstance()
    {
       return numberMachine;
    }
}


//服务时间
package cn.itheima.bank;

public class Constants {
    public static int MAX_SERVER_TIME = 10000;
    public static int MIN_SERVER_TIME = 1000;
    public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;  //分别以 1 秒 的时间  来一个客户
}

//服务窗口
package cn.itheima.bank;

import java.util.Random;
import java.util.concurrent.Executors;

public class ServiceWindow {
    private CustomerType type = CustomerType.COMMON;
    private  int windowId = 1;
   
    public void setType(CustomerType type) {
       this.type = type;
    }
    public void setWindowId(int windowId) {
       this.windowId = windowId;
   
    }
      
    public void start()
    {
       Executors.newSingleThreadExecutor().execute(new Runnable(){
          public void run()
          {
             while (true)
             {
                switch(type)
                {
                   case    COMMON:
                      commonService();
                     
                      break;
                   case    EXPRESS:
                      expressService();
                   //    Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
                      break;
                   case    VIP:
                      vipService();
                      //Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
                      break;                       
                }              
             }
          }   
       });
    }
    private void commonService() {
       String windowName = "第"+ windowId + "号" + type + "窗口";
       System.out.println(windowName+"正在获取任务");
       Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
       //System.out.println(number);
       if(number != null)
       {
          System.out.println(windowName + "为第" + number + "个普通客户服务");

          long beginTime = System.currentTimeMillis();
          int maxRand = Constants.MAX_SERVER_TIME - Constants.MIN_SERVER_TIME;
          long serverTime = new Random().nextInt(maxRand)+ Constants.MIN_SERVER_TIME; //定义服务时间
          try {
             Thread.sleep(serverTime); 
          }
          catch (InterruptedException e) {
             e.printStackTrace();
          }

         
          long endTime  = System.currentTimeMillis() - beginTime;
         
          System.out.println(windowName + "为第" + number + "个" + type + "客户完成服务,耗时"+ endTime/1000 + "秒");
       }
       else
       {
          System.out.println(windowName+"没有取到任务!!,休息啦!!");
         
          try {
             Thread.sleep(1000);  //休息1秒
          } catch (InterruptedException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
          }
         
       }
    }
    private void expressService() {
       String windowName = "第"+ windowId + "号" + type + "窗口";
       System.out.println(windowName+"正在获取任务");
       Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
       if(number != null)
       {
          System.out.println(windowName + "为第" + number + "个" + type + "服务");

          long beginTime = System.currentTimeMillis();
          //int maxRand = Constants.MAX_SERVER_TIME - Constants.MIN_SERVER_TIME;
          //long serverTime = new Random().nextInt(maxRand)+ Constants.MIN_SERVER_TIME; //定义服务时间
          try {
             Thread.sleep(Constants.MIN_SERVER_TIME);
          }
          catch (InterruptedException e) {
             e.printStackTrace();
          }

         
          long endTime  = System.currentTimeMillis() - beginTime;
         
          System.out.println(windowName + "为第" + number + "个" + type + "客户完成服务,耗时"+ endTime/1000 + "秒");
       }
       else
       {
          System.out.println(windowName+"没有取到快速客户服务任务!!");
          commonService();
         
       }
    }
    private void vipService() {
       String windowName = "第"+ windowId + "号" + type + "窗口";
       System.out.println(windowName+"正在获取任务");
       Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber();
      
       if(number != null)
       {
          System.out.println(windowName + "为第" + number + "个" + type + "客户完成服务");

          long beginTime = System.currentTimeMillis();
          int maxRand = Constants.MAX_SERVER_TIME - Constants.MIN_SERVER_TIME;
          long serverTime = new Random().nextInt(maxRand)+ Constants.MIN_SERVER_TIME;
          try {
             Thread.sleep(serverTime);
          }
          catch (InterruptedException e) {
             e.printStackTrace();
          }

         
          long endTime  = System.currentTimeMillis() - beginTime;
         
          System.out.println(windowName + "为第" + number + "个" + type + "客户完成服务,耗时"+ endTime/1000 + "秒");
       }
       else
       {
          System.out.println(windowName+"没有取到vip客户服务任务!!");
          commonService();
         
         
       }
    }
   
}

//客服类型
package cn.itheima.bank;

public enum CustomerType {
    COMMON,EXPRESS,VIP;
   
    public String toString()
    {
       switch (this)
       {
          case  COMMON:
             return "普通";
          case  EXPRESS:
             return "快速";
          case VIP:
             return this.name();
       }
       return null;
    }
}


//测试
package cn.itheima.bank;

import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class MainClass {

   
    public static void main(String[] args) {
       // TODO Auto-generated method stub
       for (int i = 1; i < 5; i++) {
          ServiceWindow commonWindow = new ServiceWindow();
          commonWindow.setWindowId(i);
          commonWindow.start();
       }
      
       ServiceWindow expressWindow = new ServiceWindow();
       expressWindow.setType(CustomerType.EXPRESS);
       //expressWindow.setWindowId(i);

       expressWindow.start();
      
       ServiceWindow vipWindow = new ServiceWindow();
       vipWindow.setType(CustomerType.VIP);
       vipWindow.start();
      
      
      
       Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
             new Runnable(){
                public void run()
                {
                  
                 Integer number = NumberMachine.getInstance().getCommonManager().generateNewManager();
                 System.out.println(number +"号普通客户等待服务!!");
                };
             },
             0,
             Constants.COMMON_CUSTOMER_INTERVAL_TIME,
             //设置时间以 秒计算
             TimeUnit.SECONDS);
       Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
             new Runnable(){
                public void run()
                {
                   Integer number = NumberMachine.getInstance().getVipManager().generateNewManager();
                    System.out.println(number +"号VIP客户等待服务!!");
                };
             },
             0,
             Constants.COMMON_CUSTOMER_INTERVAL_TIME *6,
             //设置时间以 秒计算
             TimeUnit.SECONDS);
       Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
             new Runnable(){
                public void run()
                {
                   Integer number = NumberMachine.getInstance().getExpressManager().generateNewManager();
                    System.out.println(number +"号快速客户等待服务!!");
                };
             },
             0,
             Constants.COMMON_CUSTOMER_INTERVAL_TIME *2,
             //设置时间以 秒计算
             TimeUnit.SECONDS);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值