66.黑马程序员-银行业务调度系统

来源:互联网 发布:js click target 编辑:程序博客网 时间:2024/04/30 09:03

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

  1. 首先分析这个系统的需求
  2. 这里面有哪些对象呢?
  • 分析对象前先分析有哪些对象:窗口、客户。
  • 但是这两个对象是无法调度的,不同客户怎么分配窗口?客户之间先后顺序?
  • 这里少了一个隐含的关键对象:取号机,就是银行打印号码的那种。
  • 客户按说也是一个对象,但是,这里客户只是由多线程异步产生的号码资源而已。
  • 这样两个主要对象: 窗口、取号机分析出来了。
    4.流程分析
  • 那么银行业务是一个什么流程?我们想象一下:
  • 1、窗口类,
    • 普通窗口去跟取号机要号,如果没要到,那么等一会再要。
    • 快速和VIP比较空闲,那么没取到自己专属的客户,也可以帮帮普通窗口。
    • 等窗口服务完后,告诉取号机。
    • 窗口需要提供的方法:
      • 创建三种窗口对象。
      • 窗口开启,开始运行。
    • package cn.itcast.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)//设置窗口号WindowId{this.windowId = windowId;}public void start()//窗口开始服务,{Executors.newSingleThreadExecutor().execute(new Runnable(){public void run(){while (true){switch (type) //type是窗口类型{case COMMON:commonServies();break;case EXPRESS:expressServies();break;case VIP:vipServies();break;}}}});}private void commonServies(){String windowName = "第"+windowId+"号"+type+"窗口";System.out.println(windowName + "开始获取普通任务!");Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();if(number != null){System.out.println(windowName+"开始为第"+number+"号普通客户服务!");//如果取到了普通客户号。//long beginTime =  System.currentTimeMillis();int maxRand = Constans.MAX_SERVICE_TIME-Constans.MIN_SERVICE_TIME;long serviceTime = new Random().nextInt(maxRand)+1+Constans.MIN_SERVICE_TIME;//���ֵ���1-10��try{Thread.sleep(serviceTime);} catch (InterruptedException e){// TODO Auto-generated catch blocke.printStackTrace();}//long costTime = System.currentTimeMillis()-beginTime;System.out.println(windowName+"完成为第"+number+"号"+type+"客户服务,总耗时"+(serviceTime/1000)+"秒");}elseSystem.out.println(windowName+"没有取到普通任务,休息一秒");try{Thread.sleep(1000);} catch (Exception e){// TODO: handle exception}}private void expressServies(){String windowName = "第"+windowId+"号"+type+"窗口";System.out.println(windowName + "开始获取快速任务!");Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();if(number != null){System.out.println(windowName+"开始为第"+number+"号快速客户服务!");//如果取到了普通客户号。//long beginTime =  System.currentTimeMillis();//int maxRand = Constans.MAX_SERVICE_TIME-Constans.MIN_SERVICE_TIME;int serviceTime = Constans.MIN_SERVICE_TIME;try{Thread.sleep(serviceTime);//快速客户消耗时间为最小。} catch (InterruptedException e){// TODO Auto-generated catch blocke.printStackTrace();}//long costTime = System.currentTimeMillis()-beginTime;System.out.println(windowName+"完成为第"+number+"号快速客户服务,总耗时"+(serviceTime/1000)+"秒");}elseSystem.out.println(windowName+"没有取到快速任务!");commonServies();}private void vipServies(){Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber();String windowName = "第"+windowId+"号"+type+"窗口";if(number != null){System.out.println(windowName+"开始获取VIP服务!");//long beginTime =  System.currentTimeMillis();int maxRand = Constans.MAX_SERVICE_TIME-Constans.MIN_SERVICE_TIME;long serviceTime = new Random().nextInt(maxRand)+1+Constans.MIN_SERVICE_TIME;//try{Thread.sleep(serviceTime);} catch (InterruptedException e){// TODO Auto-generated catch blocke.printStackTrace();}//long costTime = System.currentTimeMillis()-beginTime;System.out.println(windowName+"完成为第"+number+"号VIP客户服务,耗时"+(serviceTime/1000)+"秒");}elseSystem.out.println(windowName+"没有取到VIP任务!");commonServies();}}

  • 2、客户
    • 客户进门,去取号机取号,取到号码,就等待窗口叫号。
    • 客户分三种:普通、快速、VIP。
    • 取号机生成号,窗口取出号,服务结束。这里看出客户属于被操作的资源。
  • 3、取号机类
    • 取号机,只有一台。
    • 但是有三种客户类型,需要三种排序,每种客户有自己的操作方式相对独立,取号机就需要三个对象分别操作这三种客户类型。
    • 取号机需要提供的方法:
      • 创建取号机:单例,取号机只有一个。
      • 生成三个号码管理对象。
    • package cn.itcast.bank;public class NumberMachine{//单例的号码机,只有一个。private NumberMachine(){}//私有的构造方法private static NumberMachine instance = new NumberMachine();//私有的实例对象public static NumberMachine getInstance()//给外部返回一个实例{return instance;}//私有的三个号码管理器,只能通过get获取,get前先要获得号码机的实例。private NumberManager commonManager = new NumberManager();private NumberManager expressManager = new NumberManager();private NumberManager vipManager = new NumberManager();public NumberManager getCommonManager(){return commonManager;}public NumberManager getExpressManager(){return expressManager;}public NumberManager getVipManager(){return vipManager;}}

  • 4,、号码管理器类
    • 号码管理器由取号机生成。一共有三个。
    • 三个号码管理器对应三种用户类型。
    • 号码管理器提供的方法:
      • 生成号码
      • 取出号码
    • package cn.itcast.bank;import java.util.ArrayList;import java.util.List;public class NumberManager{//把号码存入集合中,每取出一个,remove一个。private int lastNumber=0;private List<Integer> queueNumberList = new ArrayList<Integer>();//下面两个方法同步操作集合。public synchronized Integer generateNewManager(){queueNumberList.add(lastNumber);return ++lastNumber; }public synchronized Integer fetchServiceNumber(){//remove会返回删除的结果。Integer number = null;if(queueNumberList.size()>0){number = queueNumberList.remove(0);}return number;}}

  • 5、MainClass
    • 包含main()方法,开启这个程序。
    • 开启过程:
      • 建立三种窗口,调用窗口的开启方法,窗口开始运营。
      • 异步生成多种客户,每生成有一个就去取号机里取一个号。
    • package cn.itcast.bank;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class MainClass{/** * @param args */public static void main(String[] args){for (int i = 1; i <5; i++){//ServiceWindow commonWindow = null;ServiceWindow Window =new ServiceWindow();Window.setWindowId(i);Window.start();}ServiceWindow expressWindow = new ServiceWindow();expressWindow.setType(CustomerType.EXPRESS);expressWindow.start();ServiceWindow vipWindow = new ServiceWindow();vipWindow.setType(CustomerType.VIP);vipWindow.start();//普通客户拿号Executors.newScheduledThreadPool(1).scheduleAtFixedRate //(new Runnable(){@Overridepublic void run(){// TODO Auto-generated method stubInteger serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewManager();System.out.println("第"+serviceNumber+"号普通客户正在等待服务!");}}, 0,Constans.COMMON_CUSTOMER_INTERVAL_TIME, //TimeUnit.SECONDS //);Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){@Overridepublic void run(){// TODO Auto-generated method stubInteger serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewManager();System.out.println("第"+serviceNumber+"号快速客户正在等待服务!");}}, 0,Constans.COMMON_CUSTOMER_INTERVAL_TIME*2, TimeUnit.SECONDS);Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){@Overridepublic void run(){// TODO Auto-generated method stubInteger serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewManager();System.out.println("第" + serviceNumber + "号VIP客户正在等待服务!");}}, 0,Constans.COMMON_CUSTOMER_INTERVAL_TIME*6, TimeUnit.SECONDS);}}

原创粉丝点击