黑马程序员——银行业务调度系统
2012-09-16 15:40
597 查看
---------------------- android培训 java培训
期待与您交流! ----------------------
银行业务调度系统
模拟实现银行业务调度系统逻辑,具体需求如下:
Ø 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
Ø 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
Ø 异步随机生成各种类型的客户,生成各类型用户的概率比例为:
VIP客户 :普通客户 :快速客户 = 1 :6 :3。
Ø 客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
Ø 各类型客户在其对应窗口按顺序依次办理业务。
Ø 当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
Ø 随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
Ø 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
号码生成器类
号码管理类
服务窗口类
用户枚举类
时间类
主方法运行类
---------------------- android培训 java培训
期待与您交流! ----------------------
详细请查看 http://edu.csdn.net/heima
期待与您交流! ----------------------
银行业务调度系统
模拟实现银行业务调度系统逻辑,具体需求如下:
Ø 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
Ø 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
Ø 异步随机生成各种类型的客户,生成各类型用户的概率比例为:
VIP客户 :普通客户 :快速客户 = 1 :6 :3。
Ø 客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
Ø 各类型客户在其对应窗口按顺序依次办理业务。
Ø 当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
Ø 随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
Ø 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
号码生成器类
package com.itcast.interview.bank; import java.util.ArrayList; import java.util.List; public class NumberManager { private int lastNumber=1;//定义号码从1号开始 private List<Integer> queueNumber=new ArrayList<Integer>();//定义一个集合,用来按顺序存储产生的号码,即来银行的顾客 //下面两个方法一定出现异步线程,即同时访问lastNumber这个变量,加上synchronized进行互斥,就可以了 public synchronized Integer generateNewManager(){//号码生成器 queueNumber.add(lastNumber);//放到集合中 return lastNumber++;//号码累加,生成下一个号码 } public synchronized Integer fetchServiceNumber(){//取出集合中第一个号码 Integer number=null; if(queueNumber.size()>0){ number=queueNumber.remove(0);//从集合中取出最先放进去的第一个元素,在现实中,就是现在排队排到最前面的客户 } return number; } }
号码管理类
package com.itcast.interview.bank; public class NumberMachine { private NumberManager commonManager =new NumberManager(); private NumberManager expressManager =new NumberManager(); private NumberManager vipManager =new NumberManager(); //分别得到三个对象的get方法 public NumberManager getCommonManager() { return commonManager; } public NumberManager getExpressManager() { return expressManager; } public NumberManager getVipManager() { return vipManager; } //对本类即数字管理器进行单例设计模式 private static NumberMachine nm=new NumberMachine(); //构造方法私有化 private NumberMachine(){ } //返回实例对象的方法,要静态实例化调用 public static NumberMachine getInstance(){ return nm; } }
服务窗口类
package com.itcast.interview.bank; import java.util.Random; import java.util.concurrent.Executors; /** * Myeclipse应用----方法抽取 * 抽取代码自动封装成方法 * 1,选中所要抽取的方法代码,单击右键--》Refactor--》Extract Method即可 * 2,快捷键 ,选中所要抽取的方法代码,alt+shift+m即可 * * @author zjw * */ public class ServiceWindow { private CustomerType type=CustomerType.COMMON; private int windowId=1; public void setWindowId(int windowId){ this.windowId=windowId; } public void setCustomerType(CustomerType type){ this.type=type; } public void start(){ Executors.newSingleThreadExecutor().execute(new Runnable(){ public void run(){ // if(type==CustomerType.COMMON){ // NumberMachine.getInstance().getCommonManager(); // }else if(type==CustomerType.EXPRESS){ // NumberMachine.getInstance().getExpressManager(); // }else if(type==CustomerType.VIP){ // NumberMachine.getInstance().getVipManager(); // } //因为switch()case要比if()else效率高,所以用switch()case switch(type){//不能用long型,String类型的,但可以用枚举 case COMMON: commonService(); break; case EXPRESS: expressService(); break; case VIP: vipService(); break; default:break; } } }); } private void commonService() { String windowName="第"+windowId+"号"+type+"窗口"; System.out.println(windowName+"正在获取任务"); Integer number=NumberMachine.getInstance().getCommonManager().fetchServiceNumber(); if(null!=number){ System.out.println(windowName+"正为第"+number+"个"+type+"客户服务"); long beginTime=System.currentTimeMillis(); int maxServeTime=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME; long serveTime=new Random().nextInt(maxServeTime)+1+Constants.MIN_SERVICE_TIME; try { Thread.sleep(serveTime); } catch (InterruptedException e) { e.printStackTrace(); } long endTime=System.currentTimeMillis(); long costTime=endTime-beginTime; System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒"); }else{ System.out.println(windowName+"没有取到任务,休息一秒钟"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } private void expressService() { String windowName="第"+windowId+"号"+type+"窗口"; System.out.println(windowName+"正在获取任务"); Integer number=NumberMachine.getInstance().getExpressManager().fetchServiceNumber(); if(null!=number){ System.out.println(windowName+"正为第"+number+"个"+type+"客户服务"); long beginTime=System.currentTimeMillis(); // int maxServeTime=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME; // long serveTime=new Random().nextInt(maxServeTime)+1+Constants.MIN_SERVICE_TIME; try { // Thread.sleep(serveTime); Thread.sleep(Constants.MIN_SERVICE_TIME); } catch (InterruptedException e) { e.printStackTrace(); } long endTime=System.currentTimeMillis(); long costTime=endTime-beginTime; System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒"); }else{ System.out.println(windowName+"没有取到任务!"); commonService();//调用普通服务 } } private void vipService() { String windowName="第"+windowId+"号"+type+"窗口"; System.out.println(windowName+"正在获取任务"); Integer number=NumberMachine.getInstance().getVipManager().fetchServiceNumber(); if(null!=number){ System.out.println(windowName+"正为第"+number+"个"+type+"客户服务"); long beginTime=System.currentTimeMillis(); int maxServeTime=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME; long serveTime=new Random().nextInt(maxServeTime)+1+Constants.MIN_SERVICE_TIME; try { Thread.sleep(serveTime); } catch (InterruptedException e) { e.printStackTrace(); } long endTime=System.currentTimeMillis(); long costTime=endTime-beginTime; System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒"); }else{ System.out.println(windowName+"没有取到任务!"); commonService();//调用普通服务 } } }
用户枚举类
package com.itcast.interview.bank; public enum CustomerType { COMMON,EXPRESS,VIP; public String toString(){ switch(this){ case COMMON:return "普通窗口"; case EXPRESS:return "快速窗口"; case VIP:return name();//直接返回枚举的名称,即"VIP" } return null; } }
时间类
package com.itcast.interview.bank; 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; }
主方法运行类
package com.itcast.interview.bank; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class MainClass { public static void main(String[] args) { for (int i = 0; i < 5; i++) { ServiceWindow commonWindow=new ServiceWindow(); commonWindow.setWindowId(i); commonWindow.start(); } ServiceWindow vipWindow=new ServiceWindow(); vipWindow.setWindowId(1);//不写的话,默认的也是1 vipWindow.setCustomerType(CustomerType.VIP); vipWindow.start(); ServiceWindow expressWindow1=new ServiceWindow(); expressWindow1.setWindowId(1);//不写的话,默认的也是1 expressWindow1.setCustomerType(CustomerType.EXPRESS); expressWindow1.start(); //vip客户 Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){ public void run(){ Integer number=NumberMachine.getInstance().getVipManager().generateNewManager(); System.out.println(number+"号vip客户等待服务!"); } }, 2,//隔多长时间开始执行 Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,//每隔多长时间执行一次 TimeUnit.SECONDS); //普通客户 Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){ public void run(){ Integer number=NumberMachine.getInstance().getCommonManager().generateNewManager(); System.out.println(number+"号普通客户等待服务!"); } }, 2,//隔多长时间开始执行 Constants.COMMON_CUSTOMER_INTERVAL_TIME,//每隔多长时间执行一次 TimeUnit.SECONDS); //快速客户 Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){ public void run(){ Integer number=NumberMachine.getInstance().getExpressManager().generateNewManager(); System.out.println(number+"号vip客户等待服务!"); } }, 2,//隔多长时间开始执行 Constants.COMMON_CUSTOMER_INTERVAL_TIME*2,//每隔多长时间执行一次 TimeUnit.SECONDS); } }
---------------------- android培训 java培训
期待与您交流! ----------------------
详细请查看 http://edu.csdn.net/heima
相关文章推荐
- 黑马程序员——银行业务调度系统
- 黑马程序员:银行业务调度系统分析及代码实现
- 黑马程序员-Java银行业务调度系统
- 黑马程序员 JAVA学习笔记 ——银行业务调度系统
- 黑马程序员_银行业务调度系统
- 黑马程序员_张孝祥_7K月薪面试题_银行业务调度系统
- 黑马程序员--面试题(银行业务调度系统)
- 黑马程序员 银行业务调度系统
- 黑马程序员_java面试题总结【2】(银行业务调度系统)
- 黑马程序员_银行业务调度系统
- 黑马程序员—银行业务调度系统
- 黑马程序员—银行业务调度系统
- 黑马程序员_银行业务调度系统
- 黑马程序员_银行业务调度系统
- 黑马程序员_7K月薪面试题破解之二_银行业务调度系统
- 黑马程序员_项目之银行业务调度系统
- 黑马程序员---银行业务调度系统
- 黑马程序员_银行业务调度系统
- 黑马程序员-银行业务调度系统学习-No.12
- 【黑马程序员】银行业务调度系统