银行调度系统

来源:互联网 发布:一款蓝色的娱乐网源码 编辑:程序博客网 时间:2024/06/02 16:12


银行业务调度系统模拟银行调度系统逻辑。需求 1.银行内有6个业务窗口,1-4为普通窗口,5为快速窗口,6为VIP窗口。2.有三种类型客户:VIP客户,快速客户(交水电费类业务),普通客户。3.一部随机生成各种类型的客户,概率比例为:VIP客户:快速客户:普通客户 = 1:3:6.4.客户办理用时设定最少时间。5.各类型客户在其对应窗口按照顺序办理业务。6.VIP和快速窗口无办理业务时刻受理普通客户,若有应该优先处理对应客户。 面向对象分析与设计1.有三种类型的客户:VIP,快速,普通,异步随机生成个类型客户。a.有一个取号机对象产生号码,好比产生客户。b.三类客户号码编排独立,系统产生一个管理三个号码管理器的对象,号码管理器在系统中只有一个,设计成单例。2。个类型客户在对应窗口按顺序依次办理业务,即依次叫号。a.各个窗口如何获得叫号信息,他一定试问相应的号码管理器。 编程代码实现:

package com.isoftstone.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.isoftstone.interview.bank;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; }}package com.isoftstone.interview.bank;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import java.util.logging.Logger;public class MainClass {  private static Logger logger = Logger.getLogger("cn.itcast.bankqueue");  public static void main(String[] args) {  //产生4个普通窗口  for(int i=1;i<5;i++){   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); }} package com.isoftstone.interview.bank;public class NumberMachine { 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; }  private NumberMachine(){} public static NumberMachine getInstance(){  return instance; }  private static NumberMachine instance = new NumberMachine();}package com.isoftstone.interview.bank;import java.util.ArrayList;import java.util.List;public class NumberManager {  private int lastNumber = 1; private List<Integer> queueNumber = new ArrayList<Integer>(); public synchronized int generateNewManager(){  queueNumber.add(lastNumber);  return lastNumber++; }  public synchronized int fetchServiceNumber(){  return queueNumber.remove(0); }}package com.isoftstone.interview.bank;import java.util.Random;import java.util.concurrent.Executors;import java.util.logging.Logger;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(){  Executors.newSingleThreadExecutor().execute(    new Runnable(){     public void run(){      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();  }  }}


原创粉丝点击