66.黑马程序员-银行业务调度系统
来源:互联网 发布:js click target 编辑:程序博客网 时间:2024/04/30 09:03
------- android培训、java培训、期待与您交流! ----------
- 首先分析这个系统的需求
- :
- 这里面有哪些对象呢?
- 分析对象前先分析有哪些对象:窗口、客户。
- 但是这两个对象是无法调度的,不同客户怎么分配窗口?客户之间先后顺序?
- 这里少了一个隐含的关键对象:取号机,就是银行打印号码的那种。
- 客户按说也是一个对象,但是,这里客户只是由多线程异步产生的号码资源而已。
- 这样两个主要对象: 窗口、取号机分析出来了。
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);}}
- 66.黑马程序员-银行业务调度系统
- 黑马程序员---银行业务调度系统
- <黑马程序员>银行业务调度系统
- 【黑马程序员】银行业务调度系统
- 黑马程序员--银行业务调度系统
- 《黑马程序员》 银行业务调度系统
- 黑马程序员-----银行业务调度系统
- 黑马程序员--银行业务调度系统
- 黑马程序员 银行业务调度系统
- 黑马程序员-------银行业务调度系统
- 黑马程序员--银行业务调度系统
- 黑马程序员-银行业务调度系统
- 黑马程序员-银行业务调度系统
- 黑马程序员-----银行业务调度系统
- 黑马程序员-银行业务调度系统
- 黑马程序员---银行业务调度系统
- 黑马程序员--银行业务调度系统
- 黑马程序员---银行业务调度系统
- JS如何判断字段是否为数字值
- 62.黑马程序员-内省
- 63.黑马程序员-注解
- 64.黑马程序员-代理
- 65.黑马程序员-交通灯管理系统
- 66.黑马程序员-银行业务调度系统
- 【旧文】采访 Dojo 开发人员的题目
- 单词、字符计数
- db2look使用
- db2命令记录
- Linux date and touch
- Burp Suite使用详解一
- Content Providers总结
- Android 日期及时间选择对话框