黑马软件工程师 改进版银行业务调度系统
黑马程序员 改进版银行业务调度系统
------- android培训、java培训、期待与您交流! ----------
我在原有代码的基础上进行了一下改进,增加了Controller类
public class Controller { private static final int CUSTOMER_FETCH = 1; private ScheduledExecutorService sch = Executors.newScheduledThreadPool(3); public Controller() { ServiceWindow.普通1.service(); ServiceWindow.普通2.service(); ServiceWindow.普通3.service(); ServiceWindow.普通4.service(); ServiceWindow.快速.service(); ServiceWindow.VIP.service(); } public void schedule() { // 普通客户 sch.scheduleAtFixedRate(new Runnable() { @Override public void run() { synchronized(this){ Integer serviceNumber = NumberGenerator.common.generalNewNumber(); System.out.println("第" + serviceNumber + "号普通客户正在等待服务!"); } } }, 0, CUSTOMER_FETCH, TimeUnit.SECONDS); // 快速客户 sch.scheduleAtFixedRate(new Runnable() { @Override public void run() { synchronized(this){ Integer serviceNumber = NumberGenerator.express.generalNewNumber(); System.out.println("第" + serviceNumber + "号快速客户正在等待服务!"); } } }, 0, CUSTOMER_FETCH * 2, TimeUnit.SECONDS); // vip客户 sch.scheduleAtFixedRate(new Runnable() { @Override public void run() { synchronized(this){ Integer serviceNumber = NumberGenerator.vip.generalNewNumber(); System.out.println("第" + serviceNumber + "号VIP客户正在等待服务!"); } } }, 0, CUSTOMER_FETCH * 6, TimeUnit.SECONDS); } }
调用方法
public class Run { public static void main(String[] args) { new Controller().schedule(); } }
ServiceWindow类采用枚举进行重写
public enum ServiceWindow { 普通1("普通", 1), 普通2("普通", 2), 普通3("普通", 3), 普通4("普通", 4), 快速( "快速", 5), VIP("VIP", 6); private static final int MAX = 10; private static final int MIN = 1; private String type; private int id; String windowName = this.name(); private ExecutorService pool; public int getId() { return id; } private ServiceWindow(String type, int id) { this.type = type; this.id = id; pool = Executors.newSingleThreadExecutor(); } public void service() { pool.execute(new Runnable() { @Override public void run() { while (true) { switch (type) { case "普通": commonService(); break; case "快速": expressService(); break; case "VIP": vipService(); break; } } } }); } private synchronized void vipService() { Integer customerNum = NumberGenerator.vip.fetchNumber(); if (customerNum != 0) { System.out.println(id + "号" + type + "窗口开始为" + customerNum + "号vip客户服务"); int serviceTime = new Random().nextInt(MAX - MIN) + 1 + MIN; try { Thread.sleep(serviceTime * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(id + "号" + type + "窗口完成为第" + customerNum + "号vip客户服务,总共耗时" + serviceTime + "秒"); } else { System.out.println(windowName + "没有取到vip任务"); commonService(); } } private synchronized void expressService() { Integer customerNum = NumberGenerator.express.fetchNumber(); if (customerNum != 0) { System.out.println(id + "号" + type + "窗口开始为" + customerNum + "号快速客户服务"); int serviceTime = MIN; try { Thread.sleep(serviceTime * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(id + "号" + type + "窗口完成为第" + customerNum + "号快速客户服务,总共耗时" + serviceTime + "秒"); } else { System.out.println(windowName + "没有取到快速任务"); commonService(); } } private synchronized void commonService() { int customerNum = NumberGenerator.common.fetchNumber(); if (customerNum != 0) { System.out.println(id + "号" + type + "窗口开始为" + customerNum + "号普通客户服务"); int serviceTime = new Random().nextInt(MAX - MIN) + 1 + MIN; try { Thread.sleep(serviceTime * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(id + "号" + type + "窗口完成为第" + customerNum + "号普通客户服务,总共耗时" + serviceTime + "秒"); } else { System.out.println(windowName + "没有取到普通任务,正在空闲一秒"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
排号生成器也用枚举重写
public enum NumberGenerator { common,express,vip; private int num = 0; private LinkedList<Integer> list = new LinkedList<>(); public int generalNewNumber() { synchronized(this){ list.addLast(++num); } return num; } public int fetchNumber() { if (list.size() > 0) synchronized(list){ return list.removeFirst(); } else return 0; } }
执行结果
普通1没有取到普通任务,正在空闲一秒 普通3没有取到普通任务,正在空闲一秒 快速没有取到快速任务 快速没有取到普通任务,正在空闲一秒 第1号普通客户正在等待服务! 2号普通窗口开始为1号普通客户服务 VIP没有取到vip任务 VIP没有取到普通任务,正在空闲一秒 普通4没有取到普通任务,正在空闲一秒 第1号快速客户正在等待服务! 第1号VIP客户正在等待服务! 第2号普通客户正在等待服务! 1号普通窗口开始为2号普通客户服务 5号快速窗口开始为1号快速客户服务 普通3没有取到普通任务,正在空闲一秒 普通4没有取到普通任务,正在空闲一秒 6号VIP窗口开始为1号vip客户服务 第3号普通客户正在等待服务! 5号快速窗口完成为第1号快速客户服务,总共耗时1秒 快速没有取到快速任务 3号普通窗口开始为3号普通客户服务 快速没有取到普通任务,正在空闲一秒 普通4没有取到普通任务,正在空闲一秒 第2号快速客户正在等待服务! 第4号普通客户正在等待服务! 5号快速窗口开始为2号快速客户服务 4号普通窗口开始为4号普通客户服务 第5号普通客户正在等待服务! 3号普通窗口完成为第3号普通客户服务,总共耗时2秒 3号普通窗口开始为5号普通客户服务 5号快速窗口完成为第2号快速客户服务,总共耗时1秒 快速没有取到快速任务 快速没有取到普通任务,正在空闲一秒 第3号快速客户正在等待服务! 第6号普通客户正在等待服务! 1号普通窗口完成为第2号普通客户服务,总共耗时4秒 2号普通窗口完成为第1号普通客户服务,总共耗时5秒 1号普通窗口开始为6号普通客户服务 普通2没有取到普通任务,正在空闲一秒 5号快速窗口开始为3号快速客户服务 6号VIP窗口完成为第1号vip客户服务,总共耗时4秒 VIP没有取到vip任务 VIP没有取到普通任务,正在空闲一秒 第7号普通客户正在等待服务! 2号普通窗口开始为7号普通客户服务 5号快速窗口完成为第3号快速客户服务,总共耗时1秒 快速没有取到快速任务 快速没有取到普通任务,正在空闲一秒 VIP没有取到vip任务 VIP没有取到普通任务,正在空闲一秒 第4号快速客户正在等待服务! 第2号VIP客户正在等待服务! 第8号普通客户正在等待服务! 3号普通窗口完成为第5号普通客户服务,总共耗时3秒 3号普通窗口开始为8号普通客户服务 5号快速窗口开始为4号快速客户服务 6号VIP窗口开始为2号vip客户服务 第9号普通客户正在等待服务! 1号普通窗口完成为第6号普通客户服务,总共耗时3秒 1号普通窗口开始为9号普通客户服务 5号快速窗口完成为第4号快速客户服务,总共耗时1秒 快速没有取到快速任务 快速没有取到普通任务,正在空闲一秒 第5号快速客户正在等待服务! 第10号普通客户正在等待服务! 5号快速窗口开始为5号快速客户服务 6号VIP窗口完成为第2号vip客户服务,总共耗时2秒 VIP没有取到vip任务 6号VIP窗口开始为10号普通客户服务 第11号普通客户正在等待服务! 4号普通窗口完成为第4号普通客户服务,总共耗时7秒 5号快速窗口完成为第5号快速客户服务,总共耗时1秒 快速没有取到快速任务 5号快速窗口开始为11号普通客户服务 普通4没有取到普通任务,正在空闲一秒 第6号快速客户正在等待服务! 第12号普通客户正在等待服务! 4号普通窗口开始为12号普通客户服务 第13号普通客户正在等待服务! 第7号快速客户正在等待服务! 第3号VIP客户正在等待服务!