- 浏览: 56034 次
- 性别:
- 来自: 北京
文章分类
最新评论
需求
模拟实现银行业务调度系统逻辑,具体需求如下:
1.银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
2.有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
3.异步随机生成各种类型的客户,生成各类型用户的概率比例为:
VIP客户 :普通客户 :快速客户 = 1 :6 :3。
4.客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
5.各类型客户在其对应窗口按顺序依次办理业务。
6.当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
7.随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
8.不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
用一个图来理解
有三种对应类型的客户:VIP客户,普通客户,快速客户 ,异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次办理业务
NumberManager类
定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合。
定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步。
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; } } }
NumberMachine类
定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个对应的方法来返回这三个NumberManager对象。
将NumberMachine类设计成单例。
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; } }
CustomerType枚举类
系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。
重写toString方法,返回类型的中文名称。这是在后面编码时重构出来的,刚开始不用考虑。
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; } }
ServiceWindow类
定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法。
定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信息。
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(){// 》定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法。 Executors.newSingleThreadExecutor().execute( new Runnable(){ public void run(){ //下面这种写法的运行效率低,最好是把while放在case下面 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(); } } private void vipService(){ Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber(); String windowName = "第" + number + "号" + type + "窗口"; System.out.println(windowName + "开始获取VIP任务!"); if(serviceNumber !=null){ System.out.println(windowName + "开始为第" + serviceNumber + "号VIP客户服务"); 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 + "号VIP客户服务,总共耗时" + serviceTime/1000 + "秒"); }else{ System.out.println(windowName + "没有取到VIP任务!"); commonService(); } } }
MainClass类
用for循环创建出4个普通窗口,再创建出1个快速窗口和一个VIP窗口。
接着再创建三个定时器,分别定时去创建新的普通客户号码、新的快速客户号码、新的VIP客户号码。MainClass类
public class MainClass { public static void main(String[] args) { //产生4个普通窗口 for(int i=1;i<5;i++){//用for循环创建出4个普通窗口 ServiceWindow window = new ServiceWindow(); window.setNumber(i); window.start(); } //产生1个快速窗口 ServiceWindow expressWindow = new ServiceWindow(); expressWindow.setType(CustomerType.EXPRESS); expressWindow.start(); //产生1个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); } }
Constants类
定义三个常量:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME
public class Constants { public static int MAX_SERVICE_TIME = 10000; //10秒! public static int MIN_SERVICE_TIME = 1000; //1秒! /*每个普通窗口服务一个客户的平均时间为5秒,一共有4个这样的窗口,也就是说银行的所有普通窗口合起来 * 平均1.25秒内可以服务完一个普通客户,再加上快速窗口和VIP窗口也可以服务普通客户,所以, * 1秒钟产生一个普通客户比较合理,*/ public static int COMMON_CUSTOMER_INTERVAL_TIME = 1; }
相关推荐
银行业务管理系统数据库设计是构建高效、稳定、安全的金融信息系统的关键步骤。这个系统涉及到多个核心实体,如部门、员工、客户、联系人、支行、账户和贷款,以及它们之间的复杂关系。下面我们将详细探讨这些实体和...
综上所述,商业银行业务管理涉及多方面的知识,包括经营理念、市场策略、信贷管理、产品创新、国际合作、技术应用、业绩评价以及应对挑战的能力。这些案例展示了商业银行如何通过有效的管理和创新实践,实现业务的...
【JSP银行业务管理系统详解】 JSP(JavaServer Pages)是一种动态网页技术,它允许开发者在HTML页面中嵌入Java代码,实现服务器端的程序逻辑。在这个“银行业务管理系统”中,JSP被用来构建一个模拟银行日常业务的...
本资源是一个关于银行业务和信息化系统的分析补遗文档,涵盖银行业务的各个方面,包括银行业发展动态、银行中间业务、银行IT系统、银行业务系统、管理信息系统等。下面是本资源的详细知识点概述: 银行业发展动态 ...
数据库大作业-基于JavaScript银行业务管理系统源码.zip数据库大作业-基于JavaScript银行业务管理系统源码.zip数据库大作业-基于JavaScript银行业务管理系统源码.zip数据库大作业-基于JavaScript银行业务管理系统源码...
java银行业务管理系统论文...希望能够帮到大家
【我国私人银行业务风险管理研究】 私人银行业务是银行业务中的一种高级形式,主要面向高净值客户,提供全方位、个性化的财富管理服务。然而,随着全球经济环境的复杂化和金融市场的波动,私人银行业务的风险管理变...
零售银行业务则关注个人客户的存款、贷款、支付等服务,而公司银行业务主要服务于企业客户,提供贷款、投资银行、现金管理等服务。金融市场业务则涵盖了证券交易、衍生品交易、资产管理等方面,体现了银行业的投资和...
本资源摘要信息中,我们将详细分析银行业务与信息化系统的相关知识点,本文共分为五章节,分别介绍银行业务、银行IT系统、银行业务系统、管理信息系统和附录。 第一章背景知识 在银行业务中,背景知识是非常重要的...
【我国私人银行业务风险管理研究】 私人银行业务是银行业务中的一种高级形式,主要针对高净值客户,提供全方位、个性化的财富管理服务。然而,随着私人银行业务的快速发展,风险管理成为了银行面临的重要课题。本...
要求:创建WPF应用程序,完成银行业务管理综合实例。 1、功能模块: 职员管理功的设计与实现 2、功能模块: 职员工资调整的设计与实现 3、功能模块: 取款功能的设计与实现 4、功能模块: 存款查询功能的设计与实现...
"银行业务管理系统功能要求" 银行业务管理系统是银行业的一个重要组成部分,旨在提供一个集中的管理平台,满足银行业的各项业务需求。本文将详细介绍银行业务管理系统的功能要求,包括系统总体功能要求、主界面、子...
银行业务系统是银行内部处理各类金融交易和客户信息的复杂网络,涵盖了从账户管理、交易处理到风险管理等多个方面。为了确保数据的准确性和系统的高效运行,银行业务系统采用了一系列标准化的数据管理策略和技术。 ...
用C#编写的银行业务管理系统,包括存款取款,利率的计算,业务员信息的管理等
银行业务管理软件的前景和范围是指银行业务管理软件的总体目标和范围,它将帮助银行业务管理软件的开发和实施。这个软件的主要功能是针对银行的储蓄业务进行有效管理,提供了零售银行业务的解决方案,帮助银行实现...
《银行管理与IT架构》是《银行业务与信息化系统分析》(再版后改为《银行业务与IT系统应用研究》,长江出版社)的姊妹篇,是原书内容的延伸和深化。本书补充了若干金融IT从业人员工作中应该了解但原书中没有讲到的...
银行业务信息管理系统是一个综合的信息管理平台,旨在提供一个统一的业务信息管理解决方案,帮助银行更好地管理业务信息。该系统旨在提供一个集中化的业务信息管理平台,帮助银行快速响应业务需求,提高业务效率和...
其次,风险管理是银行业务的核心之一。参赛者需要了解银行的风险评估方法,如信用风险、市场风险、操作风险等,并掌握如何通过风险模型进行量化分析。同时,对国内外金融市场动态的敏锐洞察也是必不可少的,因为这...