银行业务调度系统

    技术2025-12-27  5

    银行业务调度系统1.银行业务调度系统的分析:**有三种客户(普通客户,VIP客户,交水电费等等的快速客户【因为这种客户办理业务的速度最快,所以称之为快速客户】)**每个抽取过服务号码的人称为客户,三种客户就对应着三种服务,客户业务完成整个过程主要是由号码管理器与服务窗口来完成。**因此就有三个对象:号码机器(管理所有号码),号码管理器(主要是生成号码,并向服务窗口提供号码),服务窗口**主要有三个类:numberManager,numberMachine,serviceWindow2.主要代码:---numberManagerpackage cn.itcast.bank;

    import java.util.ArrayList;import java.util.List;

    /** * NumberManager主要是用来生成号码,并给服务窗口提供号码 * 由于两个方法时可能同时进行的,所以是不同的线程,他们操作的又是同一个数 * ,因此要让他们互斥,加上synchronized * @author Administrator *  */public class NumberManager { //最后一个号码,号码都是从1开始的,不可能值为<1的   private int lastNumber=0;   private List<Integer> queueNumber=new ArrayList<Integer>();   //产生新的号码   public synchronized Integer queueNewNumber(){    queueNumber.add(lastNumber);    return lastNumber++;   }   //为服务窗口提供服务号码,返回有可能是一个null,所以设计为Integer   public synchronized Integer fetchServiceNumber(){    //想服务窗口提供的号码是数组的第一个数,提供一个,数组就会减少一个        if(queueNumber.size()>0){

         return  queueNumber.remove(0);    }else{    return null;    }   }}

    ---numberMachinepackage cn.itcast.bank;

    /** * NumberMachine里面主要管理三类号码 的处理 ,NumberMachine只有一个,因此要做成单例 *  * @author Administrator *  */public class NumberMachine { // 主要是三类号码的管理(commonManager,expressManager,VipManager) 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; }

     // 把numberMachine做成单例,就是在内存中放一份numberMachine的实例对象,每次要用 // 只需从内存中取就可以了 private NumberMachine() { }

     public static NumberMachine getNumberMachine() {  return instance; }

     private static NumberMachine instance = new NumberMachine();}

    ---serviceWindowpackage cn.itcast.bank;

    import java.util.Random;import java.util.concurrent.Executors;

    /** * 服务窗口,主要是获取号码 *  * @author Administrator *  */public class ServiceWindow { // 定义客户的类型 private CustonerType type = CustonerType.COMMON; private int windowId=1;

     public void setType(CustonerType type) {  this.type = type; }

     public void setWindowId(int windowId) {  this.windowId = windowId; }

     // 开始取号的方法 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 = "第" + windowId + "号" + type + "窗口";  Integer serviceNumber = NumberMachine.getNumberMachine().getCommonManager()    .fetchServiceNumber();  //打印的放在后面,因为取号码是加锁的  System.out.println(windowName + "正在获取任务");  if (serviceNumber != null) {   System.out.println(windowName+"正在为"+"普通客户"+"客户服务");   long begin = System.currentTimeMillis();   int maxRand = Constants.MAX_SERVICE_TIME     - Constants.MIN_SERVICE_TIME;   long serviceTime = new Random().nextInt(maxRand)+1     + Constants.MIN_SERVICE_TIME;   try {    // 开始处理任务    Thread.sleep(serviceTime);   } catch (InterruptedException e) {    e.printStackTrace();   }   long costTime = System.currentTimeMillis() - begin;   System.out.println(windowName + "为第" + serviceNumber + "个客户服务完成所用的时间为:"     + costTime/1000+"秒");  } else {   System.out.println(windowName + "窗口没有获取到任务,正在空闲一秒");   try {    Thread.sleep(1000);   } catch (InterruptedException e) {    e.printStackTrace();   }  }

     }

     private void expressService() {  String windowName = "第" + windowId + "号" + type + "窗口";  Integer serviceNumber = NumberMachine.getNumberMachine().getExpressManager()    .fetchServiceNumber();  System.out.println(windowName + "正在获取任务");  if (serviceNumber != null) {   System.out.println(windowName+"正在为"+CustonerType.EXPRESS+"客户服务");   long begin = System.currentTimeMillis();   int maxRand = Constants.MAX_SERVICE_TIME     - Constants.MIN_SERVICE_TIME;   long serviceTime = new Random().nextInt(maxRand)     + Constants.MIN_SERVICE_TIME;   try {    // 开始处理任务    Thread.sleep(serviceTime);   } catch (InterruptedException e) {    e.printStackTrace();   }   long costTime = System.currentTimeMillis() - begin;   System.out.println(windowName + "为第" + serviceNumber + "个客户服务完成所用的时间为:"     + costTime);  } else {   System.out.println(windowName + "窗口没有获取到任务");   commonService();  } }

     private void vipService() {  String windowName = "第" + windowId + "号" + type + "窗口";  Integer serviceNumber = NumberMachine.getNumberMachine().getVipManager()    .fetchServiceNumber();  System.out.println(windowName + "正在获取任务");  if (serviceNumber != null) {   System.out.println(windowName+"正在为"+CustonerType.VIP+"服务");   long begin = System.currentTimeMillis();   int maxRand = Constants.MAX_SERVICE_TIME     - Constants.MIN_SERVICE_TIME;   long serviceTime = new Random().nextInt(maxRand)     + Constants.MIN_SERVICE_TIME;   try {    // 开始处理任务    Thread.sleep(serviceTime);   } catch (InterruptedException e) {    e.printStackTrace();   }   long costTime = System.currentTimeMillis() - begin;   System.out.println(windowName + "为第" + serviceNumber + "个客户服务完成所用的时间为:"     + costTime);  } else {   System.out.println(windowName + "窗口没有获取到任务");   commonService();  } }

    }

    ----辅助类------客户类型package cn.itcast.bank;/** * 客户的类型,普通的,快速的,vip的 * @author Administrator * */public enum CustonerType { COMMON, EXPRESS, VIP; public String toString() {  switch (this) {  case COMMON:   return "普通";  case EXPRESS:   return "快速";  case VIP:   return name();  }  return null; }}

    ------常量类package cn.itcast.bank;

    public class Constants { public static int MAX_SERVICE_TIME = 10000; public static int MIN_SERVICE_TIME = 1000; public static int COMMON_CUSTOMER_TIME=1;}

    ------测试类package cn.itcast.bank;

    import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;

    /** * 用于产生窗口,产生号码 * @author Administrator * */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 expressWindow=new ServiceWindow();  expressWindow.setType(CustonerType.EXPRESS);  expressWindow.start();    //用于创建vip窗口  ServiceWindow vipWindow=new ServiceWindow();  vipWindow.setType(CustonerType.VIP);  vipWindow.start();    //用户开始抽号,随机抽号  //普通用户随机产生的抽号  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(    new Runnable() {          public void run() {      Integer number=NumberMachine.getNumberMachine().getCommonManager().queueNewNumber();      System.out.println(number+"号"+CustonerType.COMMON+"客户等待服务");     }    },    0,     Constants.COMMON_CUSTOMER_TIME*6,     TimeUnit.SECONDS    );  //快速客户随机产生的抽号  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(    new Runnable() {          public void run() {      Integer number=NumberMachine.getNumberMachine().getExpressManager().queueNewNumber();      System.out.println(number+"号"+CustonerType.EXPRESS+"客户等待服务");     }    },    0,     Constants.COMMON_CUSTOMER_TIME,     TimeUnit.SECONDS    );  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(    new Runnable() {          public void run() {      Integer number=NumberMachine.getNumberMachine().getVipManager().queueNewNumber();      System.out.println(number+"号"+CustonerType.VIP+"客户等待服务");     }    },    0,     Constants.COMMON_CUSTOMER_TIME*3,     TimeUnit.SECONDS    );   }}

    最新回复(0)