银行业务调度系统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 ); }}
