- 浏览: 21512 次
- 性别:
文章分类
最新评论
业务和需求分析: 模拟实现银行业务调度系统的逻辑,具体需求如下: 1.银行内有6个业务窗口,1-4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口 2.有三种对应类型的客户:普通客户、快速客户(办理如缴水电费、电话费之类的业务)、VIP客户 3.异步随机生成各种类型的客户,生成类型的客户的比例为:VIP客户:普通客户:快速客户 = 1:6:3 4.客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需的 时间为最小值 5.各类型的客户在其对应窗口按顺序依次办理业务 6.当VIP窗口(6号)和快速窗口(5号)没有客户等待办理业务是,可以处理普通客户的业务,而一旦有对应的客户等待办理业务时,则优先处理对应客户的业务 7.随机生成客户时间间隔以及业务办理时间最大值和最小值自定义 8.不实现GUI,只考虑系统逻辑实现,通过Log方式展现程序运行结果 面向对象的分析与设计: * 设计时要遵循一个原则,谁拥有数据,谁就提供操作这些数据的方法 1.一个客户其实就是由银行的取号机生成的一个号码 2.由于客户有三类,每类客户的号码编制都是完全独立的,所以本程序一定要产生三个号码管理器对象,各自管理一类客户的排队号码,这三个号码管理器对象统一由一个取号机来管理,这个取号机对象在整个程序中只能有一个,所以要将其设计为单例 3.各种类型的客户在其对应窗口依次办理业务,准确的说,应该是窗口依次叫号,当一个窗口叫号时,要向对应的号码管理器取号 代码实现: 1.--------------------------------------------------------------------------------------------------- package com.itheima.bank; public class Constants { // 客户办理业务所需时间最小值, 单位为秒 public static int MIN_SERVICE_TIME = 1; // 客户办理业务所需时间最大值 public static int MAX_SERVICE_TIME = 10; // 随机生成普通客户的比例为1 public static int COMMON_CUSTOMER_INTERVAL_TIME = 1; } package com.itheima.bank; public enum CustomerType { COMMON, EXPRESS, VIP; public String toString() { switch (this) { case COMMON: return "普通"; case EXPRESS: return "快速"; case VIP: return "VIP"; } return null; } } 3.--------------------------------------------------------------------------------------------------- package com.itheima.bank; import java.util.ArrayList; import java.util.List; /** * 号码管理器 * * @author mrng */ public class NumberManager { // 最后一个被取的号码 private int lastNumber = 1; // 取完号码后要排队,这个集合就用来模仿队列 private List<Integer> queueNumber = new ArrayList<Integer>(); // 客户取号时调用次方法,产生新的号码 public synchronized Integer generateNewNumber() { // 加入队列 queueNumber.add(lastNumber); // 将号码返回给调用者 return lastNumber++; } // 服务窗口叫号时调用这个方法,得到在队列里面的第一个号码 public synchronized Integer fetchServiceNumber() { if (queueNumber.isEmpty()) { return null; } return queueNumber.remove(0); } } package com.itheima.bank; /** * 取号机,只能有一个取号机存在,所以设计为单例 * * @author mrng */ public class NumberMechine { private NumberManager vipNumberManager = new NumberManager(); private NumberManager commonNumberManager = new NumberManager(); private NumberManager expressNumberManager = new NumberManager(); public NumberManager getVipNumberManager() { return vipNumberManager; } public NumberManager getCommonNumberManager() { return commonNumberManager; } public NumberManager getExpressNumberManager() { return expressNumberManager; } private NumberMechine() { } private static NumberMechine instance = new NumberMechine(); // 返回取号机实例 public static NumberMechine getInstance() { return instance; } } 5.--------------------------------------------------------------------------------------------------- package com.itheima.bank; import java.util.Random; import java.util.concurrent.Executors; /** * 服务窗口 * * @author mrng */ public class ServiceWindow { // 取号机 public static NumberMechine numberMechine = NumberMechine.getInstance(); // 窗口类型,和客户类型一致,默认为普通类型 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) { Long serviceTime = (new Random() .nextInt(Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME + 1) + 1) * 1000l; switch (type) { case COMMON: // 叫号 service(numberMechine.getCommonNumberManager(), serviceTime, CustomerType.COMMON); break; case EXPRESS: boolean flag = service( numberMechine.getExpressNumberManager(), Constants.MIN_SERVICE_TIME * 1000l, CustomerType.EXPRESS); // 如果没有快速客户,为普通客户服务 if (!flag) { service(numberMechine.getCommonNumberManager(), serviceTime, CustomerType.COMMON); } break; case VIP: boolean flag2 = service( numberMechine.getVipNumberManager(), serviceTime, CustomerType.VIP); // 如果没有VIP客户,为普通客户服务 if (!flag2) { service(numberMechine.getCommonNumberManager(), serviceTime, CustomerType.COMMON); } break; } } } }); } private boolean service(NumberManager numberManager, Long serviceTime, CustomerType customerType) { // 叫号 Integer number = numberManager.fetchServiceNumber(); System.out.println(windowId + "号" + type + "窗口开始获取" + customerType + "任务"); // 如果没有叫到号,休息一秒 if (number == null) { // 如果叫的号是普通客户并且没有叫到,说明银行现在没有排队的客户,空闲1秒 if (customerType == CustomerType.COMMON) { System.out.println(windowId + "号" + type + "窗口没有获取到" + customerType + "任务,正在空闲一秒"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return false; } System.out.println(windowId + "号" + type + "窗口没有获取到" + customerType + "任务"); return false; } else {// 如果叫到了号,就开始为客户服务 System.out.println(windowId + "号" + type + "窗口开始为" + number + "号" + customerType + "客户服务"); // 开始时间 Long biginTime = System.currentTimeMillis(); try { Thread.sleep(serviceTime); } catch (InterruptedException e) { e.printStackTrace(); } // 本次服务所用的时间 Long costTime = System.currentTimeMillis() - biginTime; System.out.println(windowId + "号" + type + "窗口为" + number + "号" + customerType + "客户服务完成,耗时" + costTime / 1000 + "秒"); return true; } } } 6.--------------------------------------------------------------------------------------------------- package com.itheima.bank; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /*** * 主类 * * @author mrng */ public class MainClass { public static void main(String[] args) { // 开启4个普通窗口 for (int i = 1; i <= 4; i++) { ServiceWindow commonServiceWindow = new ServiceWindow(); commonServiceWindow.setWindowId(i); commonServiceWindow.start(); } // 开启1个快速窗口 ServiceWindow expressServiceWindow = new ServiceWindow(); expressServiceWindow.setType(CustomerType.EXPRESS); expressServiceWindow.start(); // 开启1个VIP窗口 ServiceWindow vipServiceWindow = new ServiceWindow(); vipServiceWindow.setType(CustomerType.VIP); vipServiceWindow.start(); // 制造普通客户 Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() { public void run() { NumberMechine.getInstance().getCommonNumberManager().generateNewNumber(); } }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME, TimeUnit.SECONDS); // 制造快速客户 Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() { public void run() { NumberMechine.getInstance().getExpressNumberManager().generateNewNumber(); } }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME * 3, TimeUnit.SECONDS); // 制造vip客户 Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() { public void run() { NumberMechine.getInstance().getVipNumberManager().generateNewNumber(); } }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6, TimeUnit.SECONDS); } }
发表评论
-
IO输入与输出
2012-08-13 17:21 0IO/输入输出 File类 它是IO包中唯一代表磁盘文件本身信 ... -
网络编程-总结01
2012-08-12 20:38 729网络模型: OSI参考模型 TCP/IP参考模型 ... -
IO-概念、流细节
2012-08-12 19:55 933流:就是用于读写数据的,在Java程序中,对于数据的输 ... -
黑马程序员-Java基础加强-知识总结
2012-07-30 04:24 1063------- android培训、java ... -
黑马程序员-交通灯管理系统的分析、设计、实现
2012-07-28 01:49 740------- android培训、java培训、期待与 ... -
黑马程序员-编程基础03-单例设计模式
2012-07-27 17:47 609------- android培训、java培训、期待与 ... -
黑马程序员-编程基础02-小知识点
2012-07-27 17:12 881------- android培训、jav ... -
黑马程序员-编程基础01-进制
2012-07-26 17:19 907------- android培训、java培训、期待与您交流 ... -
黑马程序员-Java开发前奏
2012-07-26 17:10 780------- android培训、java培训、期待与您交流 ... -
IO-1
2012-07-24 18:26 08.File类 1)File类是IO包中唯一代表磁 ... -
IO-2
2012-07-24 18:24 011.字符编码 计算机里只有数字,计算机里的一 ... -
为什么匿名内部类只能访问其所在方法中的final变量
2012-07-24 18:03 0(1).所谓“局部内部类”就是在对象的方法成员内部定义的类。而 ... -
黑马程序员-网络编程-总结02
2012-07-25 00:04 689------- android培训、java培训、期待与 ... -
黑马程序员-GUI
2012-07-25 00:08 667------- android培训、java培训、期待与 ... -
黑马程序员-IO包中的其它对象
2012-07-25 00:04 684------- android培训、ja ... -
黑马程序员-异常
2012-07-25 00:03 733------- android培训、java培训、期待与 ... -
黑马程序员-&和&&的区别
2012-07-24 14:31 569------- android培训、java培训、期待与 ... -
黑马程序员-将指定目录下的文件复制到指定的目录,并更改扩展名
2012-07-24 14:20 1022------- android培训、java培训、期待与 ... -
黑马程序员-几种常用排序算法
2012-07-24 14:06 597------- android培训、java培训、期待与 ... -
黑马程序员-wait and notify
2012-07-24 13:12 732------- android培训、jav ...
相关推荐
模拟实现银行业务调度系统逻辑,具体需求如下: 1.银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 2.有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、...
校车调度-校车调度系统-校车调度系统源码-校车调度管理系统-校车调度管理系统java代码-校车调度系统设计与实现-基于springboot的校车调度系统-基于Web的校车调度系统设计与实现-校车调度网站-校车调度网站代码-校车...
总结,"黑马程序员-tomcat集群部署文档资料"涵盖的范围广泛,从基础的集群概念和原理,到具体的Tomcat集群配置和优化,再到高级的源码分析,对于希望提升服务器管理和运维能力的IT从业者来说是一份宝贵的参考资料。...
校车调度-校车调度系统-校车调度系统源码-校车调度管理系统-校车调度管理系统java代码-校车调度系统设计与实现-基于springboot的校车调度系统-基于Web的校车调度系统设计与实现-校车调度网站-校车调度网站代码-校车...
在"银行业务调度系统分析"中,张孝祥老师的源码提供了深入理解这一领域的宝贵资源。通过对源码的研读,我们可以了解到如何设计和实现一个能够处理复杂业务逻辑、具备高度可扩展性和稳定性的调度系统。多线程技术在...
02-7K月薪面试题破解之二_银行业务调度系统视频教程 02-7K月薪面试题破解之二_银行业务调度系统视频教程 02-7K月薪面试题破解之二_银行业务调度系统视频教程 02-7K月薪面试题破解之二_银行业务调度系统视频教程 02-...
### Java毕业设计&课设-银行业务调度系统视频教程知识点概览 #### 一、项目背景与目标 在本项目中,我们旨在开发一个基于Java技术栈的银行业务调度系统。该系统的主要目的是提高银行内部业务处理的效率,并通过合理...
10. **文档支持**:提供的“银行业务调度系统.doc”和“银行业务调度系统.ppt”可能包含详细的设计文档和演示材料,帮助用户理解系统的架构、功能和使用方法。 通过以上分析,我们可以看出银行业务调度系统是银行...
本资源主要涵盖的是一个基于Java技术的银行业务调度系统,旨在帮助学生进行毕业设计或课程设计,通过视频教程、源代码以及相关课件提供全面的学习材料。以下是该系统涉及的关键知识点: 1. **Java编程语言**:作为...
NULL 博文链接:https://bosshida.iteye.com/blog/620814
这篇博文“银行业务调度系统的实现”探讨了如何设计并实施这样的系统,以优化银行的服务质量和效率。虽然没有具体的描述内容,但从标题和标签我们可以推测,作者可能分享了关于系统源码和使用的工具的细节。 首先,...
【张孝祥银行业务调度系统源代码】是一个专门针对银行业务流程进行优化和调度的软件系统,其核心目的是...通过研究和实践,可以提升对银行业务流程的理解,掌握系统设计和开发的技巧,为今后从事相关工作打下坚实基础。
张孝祥的【银行业务调度系统源代码】则提供了对此类系统的一种实现,通过复习和改进,优化了服务方法,提升了系统的灵活性和实用性。 在描述中,我们看到开发者在时隔两天后再次回顾和编写这部分代码,这是为了检验...