黑马程序员 银行业务调度系统
来源:互联网 发布:淘宝刷单小号哪里买 编辑:程序博客网 时间:2024/06/08 18:15
----------android培训、java培训、java学习型技术博客、期待与您交流! -----------
1. 题目要求
模拟实现银行业务调度系统逻辑,具体需求如下:
1). 银行窗口的分类
银行内有6个业务窗口:分三类窗口
[1]. 1~4号窗口为普通窗口
[2]. 5号窗口为快速窗口
[3]. 6号窗口为VIP窗口。
2). 客户的种类和比例
[1]. 客户的种类
有三种对应类型的客户
{1}. VIP客户
{2}. 普通客户
{3}. 快速客户 (办理如交水电费、电话费之类业务的客户)
[2]. 客户的比例
{1}. 异步随机生成各种类型的客户
{2}. 生成各类型用户的概率比例为
VIP客户 :普通客户 :快速客户 = 1 :6 :3
3). 客户办理业务的时间规定
客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
【注意1】各类型客户在其对应窗口按顺序依次办理业务
【注意2】随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
4). VIP窗口和快速业务窗口的额外要求
当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
【其他注意】不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
2, 逻辑分析
根据需求:需要定义三种客户:COMMON,EXPRESS,VIP
如果是模拟真实环境,那就要定义一个取号机了,一个银行只有一个取号机,所以可以定义为单例模式,
但是有了三种客户,所有客户都要叫号的,所以要定义三个号码管理器,来生成对应客户的号码,
最后就是 写服务窗口的逻辑了,
号码管理器:
属性: lastNumber号用于记录被取的最后的号
queueNumber用于存储产生的号码
方法: 产生新号码,存储在queueNumber中,
取出queueNumber中的号码给客户
public class NumberManager {private int lastNumber = 1;private List<Integer> queueNumber = new ArrayList<Integer>();public synchronized Integer generateNewManager(){queueNumber.add(lastNumber);return lastNumber++;}public synchronized Integer fethcServiceNumber(){Integer number = null;if(queueNumber.size() > 0)number = queueNumber.remove(0);return number;}}
号码机:
属性: 对应三个号码管理器的引用,在初始化时就产生三个号码管理器对象
方法: 提供三个号码管理器的get方法,用于获取对应的号码管理器,
提供getInstance()方法,返回唯一的号码管理机对象。
public class NumberMachine {private NumberManager commonManager = new NumberManager();private NumberManager expreessManager = new NumberManager();private NumberManager vipManager = new NumberManager();public NumberManager getCommonManager() {return commonManager;}public NumberManager getExpreessManager() {return expreessManager;}public NumberManager getVipManager() {return vipManager;}private NumberMachine(){}public static NumberMachine getInstance(){return instance;}private static NumberMachine instance = new NumberMachine();}
服务窗口:
属性: type用于定义服务窗口服务的客户类型,
windowid用于记录服务窗口的名称
方法: start用于启动服务
逻辑: 如果普通窗口没有获取到客户服务,就休息一秒,继续叫号
如果快速窗口没有获取到服务,就转到普通窗口为普通客户服务,
如果VIP窗口没有获取到服务,就转到普通窗口为普通客户服务,
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 = windowId;}public void start(){Executors.newSingleThreadExecutor().execute(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){switch (type) {case COMMON:commonService();break;case EXPRESS:expressService();break;default:vipService();break;}}}});}private void commonService() {String windowName = "第"+WindowId+"号"+type+"窗口";System.out.println(windowName+"正在获取任务");Integer num = NumberMachine.getInstance().getCommonManager().fethcServiceNumber();if(num != null){System.out.println(windowName +"为第"+num+"个"+type+"客户服务");long beginTime = System.currentTimeMillis();int maxRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;long serveTime = new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;try {Thread.sleep(serveTime);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}long costTime = System.currentTimeMillis()-beginTime;System.out.println(windowName +"为第"+num+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒");}else{System.out.println(windowName+"没有取到任务,先休息1秒钟");try {Thread.sleep(1000);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}}private void expressService() {String windowName = "第"+WindowId+"号"+type+"窗口";System.out.println(windowName+"正在获取任务");Integer num = NumberMachine.getInstance().getExpreessManager().fethcServiceNumber();if(num != null){long beginTime = System.currentTimeMillis();//int maxRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;//long serveTime = new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;try {Thread.sleep(Constants.MIN_SERVICE_TIME);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}long costTime = System.currentTimeMillis()-beginTime;System.out.println(windowName +"为第"+num+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒");}else{System.out.println(windowName+"没有取到任务!");commonService();}}private void vipService() {String windowName = "第"+WindowId+"号"+type+"窗口";System.out.println(windowName+"正在获取任务");Integer num = NumberMachine.getInstance().getVipManager().fethcServiceNumber();if(num != null){System.out.println(windowName +"为第"+num+"个"+type+"客户服务");long beginTime = System.currentTimeMillis();int maxRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;long serveTime = new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;try {Thread.sleep(serveTime);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}long costTime = System.currentTimeMillis()-beginTime;System.out.println(windowName +"为第"+num+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒");}else{System.out.println(windowName+"没有取到任务!");commonService();}}}
主函数:
主要任务是产生4个普通窗口,1个快速窗口,1个VIP窗口,初始化号码管理器,进行产生号码动作,普通客户每秒产生一个,快速客户每2秒产生一个,vip客户每6秒产生一个。
public class MainClass {public static void main(String[] args) {for(int i = 1; i< 5; i++){ServiceWindow commonWindow = new ServiceWindow();commonWindow.setWindowId(i);commonWindow.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 number = NumberMachine.getInstance().getCommonManager().generateNewManager();System.out.println(number+"号普通客户等待服务");}},0,Constants.COMMON_CUSTOMER_INTERVAL_TIME,TimeUnit.SECONDS);Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubInteger number = NumberMachine.getInstance().getExpreessManager().generateNewManager();System.out.println(number+"号快速客户等待服务");}},0,Constants.COMMON_CUSTOMER_INTERVAL_TIME×2,TimeUnit.SECONDS);Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubInteger number = NumberMachine.getInstance().getVipManager().generateNewManager();System.out.println(number+"号VIP客户等待服务");}},0,Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,TimeUnit.SECONDS);}}
验证结果:
辅助类: 常量设置
public class Constants {public static int MAX_SERVICE_TIME = 10000;public static int MIN_SERVICE_TIME = 1000;public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;}
辅助类: 客户设置
public enum CustomerType {COMMON,EXPRESS,VIP;public String toString(){switch (this) {case COMMON:return "普通";case EXPRESS:return "快速";default:return "VIP";}}}
----------android培训、java培训、java学习型技术博客、期待与您交流! -----------
- 黑马程序员---银行业务调度系统
- <黑马程序员>银行业务调度系统
- 【黑马程序员】银行业务调度系统
- 黑马程序员--银行业务调度系统
- 《黑马程序员》 银行业务调度系统
- 黑马程序员-----银行业务调度系统
- 黑马程序员--银行业务调度系统
- 黑马程序员 银行业务调度系统
- 黑马程序员-------银行业务调度系统
- 黑马程序员--银行业务调度系统
- 黑马程序员-银行业务调度系统
- 黑马程序员-银行业务调度系统
- 黑马程序员-----银行业务调度系统
- 黑马程序员-银行业务调度系统
- 黑马程序员---银行业务调度系统
- 黑马程序员--银行业务调度系统
- 黑马程序员---银行业务调度系统
- 黑马程序员-----银行业务调度系统
- 3D电影,左右格式转红蓝格式
- 与opengl相关代码
- ICG技术专栏---互联网应用如何穿越NAT
- c++ vector erase删除元素
- 与Android camera相关代码
- 黑马程序员 银行业务调度系统
- word 宏 图全部自动设置插入题注
- Qt,Qt Creator,minGW,VS关系
- JAVA命令启动ofbiz
- Linux Redhat5.4 扩容时新建分区报错No free sectors available
- 证书相关
- Exercise 5.1
- 与dalvik相关
- 人脸识别中的八大难题,何时能解