黑马程序员_21 银行业务调度系统
2013-08-31 17:24
666 查看
---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ---------------------- 银行业务调度系统 模拟现实银行业务调度系统逻辑,需求如下: >银行内有六个业务窗口,1-4号为普通,5号为快速,6号为vip窗口。 >三种客户:vip,普通,快速客户。 >异步随机生成各种类型客户的比例为: vip:普:快速=1:6:3 >客户办理时间随机设定,但是有最大最小值。快速客户所需时间为最小值。 >各类型客户在其对应窗口按顺序依次办理业务。 >当vip和快速窗口没有客户等待办理业务的时候。这两个窗口处理普通业务,一旦有对应 客户业务时,优先处理对应客户业务。 分析: 1:首先要有一个号码管理器,负责号码的生成,和获取,这里用到了集合的增删,这里我们 选用list中的ArrayList 对号码生成,和取出。 2:然后还要有不同类型的号码管理的三个机器,而且这三个机器在一个号码管理器中,而且 这个机器只能有一个。用到单例。 3:对服务窗口的设置,由于只能有普通,快速,vip三个窗口,用枚举思想定义三个窗口。然 后根据窗口进行设置。 设计: 1:用于号码管理的NumberManage,里面产生号码的方法:generateNewManage。获取号码 的方法fetchserviceNumber。不断地往Arraylist集合里添加,是生成号码,删除是获取号码。 2:需要三个这样的管理器。而这三个管理器又在一个机器中,机器只有一个。用单例创建这一 个NumberMachine机器。分别是:普通号码的getCommonManager 快速getExpressManager, vip:getVIPManager 3:服务窗口ServiceWindow中的用枚举定义的三个窗口COMMON,EXPRESS,VIP。 4:对窗口进行一系列的设置。 5:启动程序。 package cn.itcast.bank; import java.util.ArrayList; import java.util.List; public class NumberManager { private int lastNumber = 0; private List queueNumbers = new ArrayList(); public synchronized Integer generateNewNumber(){//产生号码 queueNumbers.add(lastNumber++); return lastNumber; } public synchronized Integer fetchNumber(){//用来取号 if(queueNumbers.size()>0){ return (Integer)queueNumbers.remove(0); } else{ return null; } } } 管理三个号码管理器的设备: package cn.itcast.bank; public class NumberMachine { //用单例。使类只能有一个对象 private NumberMachine(){} private static NumberMachine instance = new NumberMachine(); public static NumberMachine getInstance(){ return instance; } //创建三个不同类型的号码管理器 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; } } 服务窗口的创建: package cn.itcast.bank; import java.util.Random; import java.util.concurrent.Executors; import java.util.logging.Logger; public class ServiceWindow { private static Logger logger = Logger.getLogger("cn.itcast.bankqueue"); private CustomerType type = CustomerType.COMMON; private int number = 1; public CustomerType getType() { return type; } public void setType(CustomerType type) { this.type = type; } public void setNumber(int number){ this.number = number; } public void start(){ Executors.newSingleThreadExecutor().execute( new Runnable(){ public void run(){ //判断是哪个窗口,调用哪个方法 while(true){ switch(type){ case COMMON: commonService(); break; case EXPRESS: expressService(); break; case VIP: vipService(); break; } } } } ); } //普通窗口 private void commonService(){ String windowName = "第" + number + "号" + type + "窗口"; System.out.println(windowName + "正在获取任务"); Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchNumber(); if(serviceNumber != null ){ System.out.println(windowName + "为第" + serviceNumber + "提供服务"); int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME; int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME; try { Thread.sleep(serviceTime); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(windowName + "为第" + serviceNumber + "完成服务用时" + serviceTime/1000 + "秒"); } else{ System.out.println(windowName + "没有取到任务"); try{ Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } //快速窗口 private void expressService(){ Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber(); String windowName = "第"+ number + "号" + type + "窗口"; System.out.println(windowName + "正在获取任务"); if(serviceNumber !=null){ System.out.println(windowName + "为第" + serviceNumber + "提供服务"); int serviceTime = Constants.MIN_SERVICE_TIME; try { Thread.sleep(serviceTime); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(windowName + "为第" + serviceNumber + "完成服务用时" + serviceTime/1000 + "秒"); }else{ System.out.println(windowName + "没有取到任务"); commonService(); } } //vip窗口 private void vipService(){ Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber(); String windowName = "第" + number + "号" + type + "窗口"; System.out.println(windowName + "正在获取任务"); if(serviceNumber !=null){ System.out.println(windowName + "为第" + serviceNumber + "提供服务"); int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME; int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME; try { Thread.sleep(serviceTime); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(windowName + "为第" + serviceNumber + "完成服务用时" + serviceTime/1000 + "秒"); }else{ System.out.println(windowName + "没有取到任务"); commonService(); } } } //用枚举定义的三个窗口 package cn.itcast.bank; public enum CustomerType { COMMON,EXPRESS,VIP; public String toString(){ String name = null; switch(this){ case COMMON: name = "普通"; break; case EXPRESS: name = "快速"; break; case VIP: name = name(); break; } return name; } } //窗口服务用到的常量 package cn.itcast.bank; public class Constants { public static int MAX_SERVICE_TIME = 10000; //10秒 public static int MIN_SERVICE_TIME = 1000; //1秒 public static int COMMON_CUSTOMER_INTERVAL_TIME = 1; } package cn.itcast.bank; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; public class MainClass { private static Logger logger = Logger.getLogger("cn.itcast.bankqueue"); public static void main(String[] args) { //定义四个普通窗口,并运行 for(int i=1;i<5;i++){ ServiceWindow window = new ServiceWindow(); window.setNumber(i); window.start(); } //定义快速窗口 ServiceWindow expressWindow = new ServiceWindow(); expressWindow.setType(CustomerType.EXPRESS); expressWindow.start(); //定义vip窗口 ServiceWindow vipWindow = new ServiceWindow(); vipWindow.setType(CustomerType.VIP); vipWindow.start(); //普通客户 Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable(){ public void run(){ Integer serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewNumber(); System.out.println("第"+ serviceNumber + "号普通客户等待服务"); } }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME, TimeUnit.SECONDS); //快速客户 Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable(){ public void run(){ Integer serviceNumber = NumberMachine.getInstance().getExpressManager().generateNewNumber(); System.out.println("第"+ serviceNumber + "号快速客户等待服务"); } }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2, TimeUnit.SECONDS); //VIP客户 Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable(){ public void run(){ Integer serviceNumber = NumberMachine.getInstance().getVipManager().generateNewNumber(); System.out.println("第"+ serviceNumber + "号vip客户等待服务"); } }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6, TimeUnit.SECONDS); } } ---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ---------------------- |
相关文章推荐
- 黑马程序员-7K月薪面试题破解之二_银行业务调度系统
- 黑马程序员_java银行业务调度系统
- 黑马程序员_银行业务调度系统
- 【黑马程序员】Java学习技术博客——银行业务调度系统
- 【学习并改进】黑马程序员-张孝祥-银行业务调度系统
- 黑马程序员-银行业务调度系统
- 黑马程序员-面试题之银行业务调度系统
- 黑马程序员——银行业务调度系统
- 黑马程序员--银行业务调度系统--java学习日记14(7K)
- 黑马程序员 7K面试题 银行业务调度系统
- 黑马程序员 银行业务调度系统
- 黑马程序员-----7K面试题之银行业务调度系统
- 黑马程序员_Java_银行业务调度系统
- 黑马程序员-银行业务调度系统
- 黑马程序员_银行业务调度系统
- 【黑马程序员】银行业务调度系统学习总结
- 黑马程序员_7K面试题之银行业务调度系统
- 黑马程序员_银行业务调度系统
- 黑马程序员7K---银行业务调度系统
- 黑马程序员:银行业务调度系统