黑马程序员 银行业务调度系统

来源:互联网 发布:淘宝刷单小号哪里买 编辑:程序博客网 时间: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学习型技术博客、期待与您交流! -----------

原创粉丝点击