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

来源:互联网 发布:mac找不到照片宗卷 编辑:程序博客网 时间:2024/05/22 14:04

                                          ----------------------    android培训    java培训   期待与您交流!    ----------------------   
              

银行业务调度系统

模拟实现银行业务调度系统逻辑,具体需求如下:

Ø 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。

Ø 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。

Ø 异步随机生成各种类型的客户,生成各类型用户的概率比例为:

        VIP客户 :普通客户 :快速客户  =  1 3

Ø 客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。

Ø 各类型客户在其对应窗口按顺序依次办理业务。 

Ø 当VIP6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。

Ø 随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。

Ø 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。



号码生成器类

[java] view plaincopyprint?
  1. package com.itcast.interview.bank;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. public class NumberManager {  
  7.     private int lastNumber=1;//定义号码从1号开始  
  8.     private List<Integer> queueNumber=new ArrayList<Integer>();//定义一个集合,用来按顺序存储产生的号码,即来银行的顾客  
  9.     //下面两个方法一定出现异步线程,即同时访问lastNumber这个变量,加上synchronized进行互斥,就可以了  
  10.     public synchronized Integer generateNewManager(){//号码生成器  
  11.         queueNumber.add(lastNumber);//放到集合中  
  12.         return lastNumber++;//号码累加,生成下一个号码  
  13.     }  
  14.     public synchronized Integer fetchServiceNumber(){//取出集合中第一个号码  
  15.         Integer number=null;  
  16.         if(queueNumber.size()>0){  
  17.             number=queueNumber.remove(0);//从集合中取出最先放进去的第一个元素,在现实中,就是现在排队排到最前面的客户  
  18.         }  
  19.         return number;  
  20.     }  
  21. }         

号码管理类

[java] view plaincopyprint?
  1. package com.itcast.interview.bank;  
  2.   
  3. public class NumberMachine {  
  4.     private NumberManager commonManager =new NumberManager();  
  5.     private NumberManager expressManager =new NumberManager();  
  6.     private NumberManager vipManager =new NumberManager();  
  7.       
  8.     //分别得到三个对象的get方法  
  9.     public NumberManager getCommonManager() {  
  10.         return commonManager;  
  11.     }  
  12.     public NumberManager getExpressManager() {  
  13.         return expressManager;  
  14.     }  
  15.     public NumberManager getVipManager() {  
  16.         return vipManager;  
  17.     }  
  18.       
  19.     //对本类即数字管理器进行单例设计模式  
  20.     private static NumberMachine nm=new NumberMachine();  
  21.     //构造方法私有化  
  22.     private NumberMachine(){  
  23.           
  24.     }   
  25.     //返回实例对象的方法,要静态实例化调用  
  26.     public static NumberMachine getInstance(){  
  27.         return nm;  
  28.     }  
  29. }  

服务窗口类

[java] view plaincopyprint?
  1. package com.itcast.interview.bank;  
  2.   
  3. import java.util.Random;  
  4. import java.util.concurrent.Executors;  
  5. /** 
  6.  * Myeclipse应用----方法抽取 
  7.  * 抽取代码自动封装成方法 
  8.  * 1,选中所要抽取的方法代码,单击右键--》Refactor--》Extract Method即可 
  9.  * 2,快捷键 ,选中所要抽取的方法代码,alt+shift+m即可 
  10.  *  
  11.  * @author zjw 
  12.  * 
  13.  */  
  14. public class ServiceWindow {  
  15.     private CustomerType type=CustomerType.COMMON;  
  16.     private int windowId=1;  
  17.     public void setWindowId(int windowId){  
  18.         this.windowId=windowId;  
  19.     }  
  20.     public void setCustomerType(CustomerType type){  
  21.         this.type=type;  
  22.     }  
  23.       
  24.       
  25.     public void start(){  
  26.         Executors.newSingleThreadExecutor().execute(new Runnable(){  
  27.             public void run(){  
  28. //              if(type==CustomerType.COMMON){  
  29. //                  NumberMachine.getInstance().getCommonManager();  
  30. //              }else if(type==CustomerType.EXPRESS){  
  31. //                  NumberMachine.getInstance().getExpressManager();  
  32. //              }else if(type==CustomerType.VIP){  
  33. //                  NumberMachine.getInstance().getVipManager();  
  34. //              }  
  35.                   
  36.                   
  37.                 //因为switch()case要比if()else效率高,所以用switch()case  
  38.                 switch(type){//不能用long型,String类型的,但可以用枚举  
  39.                     case COMMON:  
  40.                         commonService();  
  41.                         break;  
  42.                     case EXPRESS:  
  43.                         expressService();  
  44.                         break;  
  45.                     case VIP:  
  46.                         vipService();  
  47.                         break;  
  48.                     default:break;  
  49.                 }  
  50.             }  
  51.         });  
  52.     }  
  53.     private void commonService() {  
  54.         String windowName="第"+windowId+"号"+type+"窗口";  
  55.         System.out.println(windowName+"正在获取任务");  
  56.         Integer number=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();  
  57.         if(null!=number){  
  58.             System.out.println(windowName+"正为第"+number+"个"+type+"客户服务");  
  59.             long beginTime=System.currentTimeMillis();  
  60.             int maxServeTime=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;  
  61.             long serveTime=new Random().nextInt(maxServeTime)+1+Constants.MIN_SERVICE_TIME;  
  62.             try {  
  63.                 Thread.sleep(serveTime);  
  64.             } catch (InterruptedException e) {  
  65.                 e.printStackTrace();  
  66.             }  
  67.             long endTime=System.currentTimeMillis();  
  68.             long costTime=endTime-beginTime;  
  69.             System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒");  
  70.         }else{  
  71.             System.out.println(windowName+"没有取到任务,休息一秒钟");  
  72.             try {  
  73.                 Thread.sleep(1000);  
  74.             } catch (InterruptedException e) {  
  75.                 e.printStackTrace();  
  76.             }  
  77.         }  
  78.     }  
  79.     private void expressService() {  
  80.         String windowName="第"+windowId+"号"+type+"窗口";  
  81.         System.out.println(windowName+"正在获取任务");  
  82.         Integer number=NumberMachine.getInstance().getExpressManager().fetchServiceNumber();  
  83.         if(null!=number){  
  84.             System.out.println(windowName+"正为第"+number+"个"+type+"客户服务");  
  85.             long beginTime=System.currentTimeMillis();  
  86. //          int maxServeTime=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;  
  87. //          long serveTime=new Random().nextInt(maxServeTime)+1+Constants.MIN_SERVICE_TIME;  
  88.             try {  
  89. //              Thread.sleep(serveTime);  
  90.                 Thread.sleep(Constants.MIN_SERVICE_TIME);  
  91.             } catch (InterruptedException e) {  
  92.                 e.printStackTrace();  
  93.             }  
  94.             long endTime=System.currentTimeMillis();  
  95.             long costTime=endTime-beginTime;  
  96.             System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒");  
  97.         }else{  
  98.             System.out.println(windowName+"没有取到任务!");  
  99.             commonService();//调用普通服务  
  100.         }  
  101.     }  
  102.     private void vipService() {  
  103.         String windowName="第"+windowId+"号"+type+"窗口";  
  104.         System.out.println(windowName+"正在获取任务");  
  105.         Integer number=NumberMachine.getInstance().getVipManager().fetchServiceNumber();  
  106.         if(null!=number){  
  107.             System.out.println(windowName+"正为第"+number+"个"+type+"客户服务");  
  108.             long beginTime=System.currentTimeMillis();  
  109.             int maxServeTime=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;  
  110.             long serveTime=new Random().nextInt(maxServeTime)+1+Constants.MIN_SERVICE_TIME;  
  111.             try {  
  112.                 Thread.sleep(serveTime);  
  113.             } catch (InterruptedException e) {  
  114.                 e.printStackTrace();  
  115.             }  
  116.             long endTime=System.currentTimeMillis();  
  117.             long costTime=endTime-beginTime;  
  118.             System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒");  
  119.         }else{  
  120.             System.out.println(windowName+"没有取到任务!");  
  121.             commonService();//调用普通服务  
  122.         }  
  123.     }  
  124. }  






用户枚举类

[java] view plaincopyprint?
  1. package com.itcast.interview.bank;  
  2.   
  3. public enum CustomerType {  
  4.     COMMON,EXPRESS,VIP;  
  5.     public String toString(){  
  6.         switch(this){  
  7.             case COMMON:return "普通窗口";  
  8.             case EXPRESS:return "快速窗口";  
  9.             case VIP:return name();//直接返回枚举的名称,即"VIP"  
  10.         }   
  11.         return null;   
  12.     }  
  13. }  

时间类

[java] view plaincopyprint?
  1. package com.itcast.interview.bank;  
  2.   
  3. public class Constants {  
  4.     public static int MAX_SERVICE_TIME=10000;  
  5.     public static int MIN_SERVICE_TIME=1000;  
  6.     public static int COMMON_CUSTOMER_INTERVAL_TIME=1;  
  7. }  

主方法运行类

[java] view plaincopyprint?
  1. package com.itcast.interview.bank;  
  2.   
  3. import java.util.concurrent.Executors;  
  4. import java.util.concurrent.TimeUnit;  
  5.   
  6. public class MainClass {  
  7.     public static void main(String[] args) {  
  8.         for (int i = 0; i < 5; i++) {  
  9.             ServiceWindow commonWindow=new ServiceWindow();  
  10.             commonWindow.setWindowId(i);  
  11.             commonWindow.start();  
  12.         }  
  13.         ServiceWindow vipWindow=new ServiceWindow();  
  14.         vipWindow.setWindowId(1);//不写的话,默认的也是1  
  15.         vipWindow.setCustomerType(CustomerType.VIP);  
  16.         vipWindow.start();  
  17.           
  18.         ServiceWindow expressWindow1=new ServiceWindow();  
  19.         expressWindow1.setWindowId(1);//不写的话,默认的也是1  
  20.         expressWindow1.setCustomerType(CustomerType.EXPRESS);  
  21.         expressWindow1.start();  
  22.           
  23.         //vip客户  
  24.         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){  
  25.             public void run(){  
  26.                 Integer number=NumberMachine.getInstance().getVipManager().generateNewManager();  
  27.                 System.out.println(number+"号vip客户等待服务!");  
  28.             }  
  29.         },   
  30.         2,//隔多长时间开始执行  
  31.         Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,//每隔多长时间执行一次  
  32.         TimeUnit.SECONDS);  
  33.           
  34.         //普通客户  
  35.         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){  
  36.             public void run(){  
  37.                 Integer number=NumberMachine.getInstance().getCommonManager().generateNewManager();  
  38.                 System.out.println(number+"号普通客户等待服务!");  
  39.             }  
  40.         },   
  41.         2,//隔多长时间开始执行  
  42.         Constants.COMMON_CUSTOMER_INTERVAL_TIME,//每隔多长时间执行一次  
  43.         TimeUnit.SECONDS);  
  44.           
  45.         //快速客户  
  46.         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){  
  47.             public void run(){  
  48.                 Integer number=NumberMachine.getInstance().getExpressManager().generateNewManager();  
  49.                 System.out.println(number+"号vip客户等待服务!");     
  50.             }  
  51.         },   
  52.         2,//隔多长时间开始执行  
  53.         Constants.COMMON_CUSTOMER_INTERVAL_TIME*2,//每隔多长时间执行一次  
  54.         TimeUnit.SECONDS);  
  55.     }  
  56. }  



                                          ----------------------    android培训    java培训   期待与您交流!    ----------------------   
                         详细请查看      http://edu.csdn.net/heima
原创粉丝点击