------------- java培训、android培训、java博客、java学习型技术博客、期待与您交流! --------------
1: 银行业务调度系统
需求:(1)银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
(2)有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。(3)异步随机生成各种类型的客户,生成各类型用户的概率比例为:VIP客户 :普通客户 :快速客户 = 1 :6 :3。(4)客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。(5)各类型客户在其对应窗口按顺序依次办理业务。(6)当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。(7)随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。(8)不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
2: 有三种对应类型的客户:VIP客户,普通客户,快速客户
定义一个枚举类型: 类型为以上三种变量:
代码如下:
package com.itcast.bank; public enum CustomerType { Common, Express, Vip; public String toString() { switch(this) { case Common: return "普通"; case Express: return "快速"; case Vip: return name(); } return null; } }
3: 随机生成不同类型的客户,可以理解为:产生不同类别的数字:
每种类型的人员对应一种不同的数字管理器。
package com.itcast.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(); }
以上定义了三种类型的管理器,分别是commanManager expressManager 和vipManager
4: 数字管理器定义为如下:
package com.itcast.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 Integer generateNewManager() { queueNumber.add(lastNumber); return lastNumber++; } public synchronized Integer fetchServiceNumber() { Integer number = null; if(queueNumber.size() > 0 ) return number = queueNumber.remove(0); return number; } }
generateNewManger 是用来模拟人进银行取号的情景,不管是什么类型的人。
fetchServieNumber 是窗口用来取号,为当前号人服务的。
5: 下面是程序的核心 : 服务窗口类
它根据settype 函数设置为不同的窗口类型,分别对应于不同的用户。
根据需求: 一共为4个普通窗口 一个vip窗口 一个快速窗口
所以分别:
for(int i=0;i<4;i++) { ServiceWindwo commonwindow = new ServiceWindwo(); commonwindow.setWindowId(i); commonwindow.start(); } ServiceWindwo expresswindow = new ServiceWindwo(); expresswindow.setType(CustomerType.Express); expresswindow.setWindowId(5); expresswindow.start(); ServiceWindwo vipwindow = new ServiceWindwo(); vipwindow.setType(CustomerType.Vip); vipwindow.setWindowId(6); vipwindow.start();
package com.itcast.bank; import java.util.Random; import java.util.concurrent.Executors; public class ServiceWindwo { private CustomerType type = CustomerType.Common; //定义初始值 private int windowId = 1; public void setType(CustomerType type) { this.type = type; } public void setWindowId(int windowId) { this.windowId = windowId; } private void commonService() { String windowName = "第"+ windowId + "号"+ type + "窗口"; System.out.println(windowName+"正在获取普通任务"); Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber(); if(number != null) { long beginTime = System.currentTimeMillis(); int maxRand = Constans.Max_Service_Time - Constans.Min_Service_Time; long serverTime= new Random().nextInt(maxRand)+1; try { Thread.sleep(serverTime); } catch (InterruptedException e) { e.printStackTrace(); } long endTime = System.currentTimeMillis(); System.out.println(windowName+ "为第"+number+"个"+type + "客户完成服务,耗时"+(beginTime - endTime)/1000); } else { System.out.println(windowName+"没有取到普通任务,休息一秒"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } private void expressService() { String windowName = "第"+ windowId + "号"+ type + "窗口"; System.out.println(windowName+"正在获取快速任务"); Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber(); if(number != null) { long beginTime = System.currentTimeMillis(); try { Thread.sleep(Constans.Min_Service_Time); } catch (InterruptedException e) { e.printStackTrace(); } long endTime = System.currentTimeMillis(); System.out.println(windowName+ "为第"+number+"个"+type + "客户完成服务,耗时"+(beginTime - endTime)/1000); } else { System.out.println(windowName +"没有取到快速任务"); commonService(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } private void vipService() { String windowName = "第"+ windowId + "号"+ type + "窗口"; System.out.println(windowName+ "正在获取vip任务"); Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber(); if(number != null) { long beginTime = System.currentTimeMillis(); int maxRand = Constans.Max_Service_Time - Constans.Min_Service_Time; long serverTime= new Random().nextInt(maxRand)+1; try { Thread.sleep(serverTime); } catch (InterruptedException e) { e.printStackTrace(); } long endTime = System.currentTimeMillis(); System.out.println(windowName+ "为第"+number+"个"+type + "客户完成服务,耗时"+(beginTime - endTime)/1000); } else { System.out.println(windowName + "没有取到vip任务"); commonService(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public void start(){ Executors.newSingleThreadExecutor().execute(new Runnable() { @Override public void run() { while(true) { switch (type) { case Common: commonService(); break; case Express: expressService(); break; case Vip: vipService(); break; default: break; } } } }); } }
commonService 函数对应与普通用户的函数,
expressService 函数对应于快速用户的函数
在这个函数中优先取得快速用户的号码,如果快速用户的号码为空,则转为取普通用户的号码。
vipService函数对应于vip用户的服务。
在这个函数中优先取得vip用户的号码,如果vip用户的号码为空,则转为普通用户的号码。
start 函数则根据不同的type类型开启不同 的用户服务
6: 以下是主程序:
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
Integer number = NumberMachine.getInstance().getCommonManager().generateNewManager();
System.out.println(number + "普通客户进来了,等待服务");
}},
0,
1,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
Integer number = NumberMachine.getInstance().getExpressManager().generateNewManager();
System.out.println(number + "快速客户进来了,等待服务");
}
},
0,
3,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
Integer number = NumberMachine.getInstance().getVipManager().generateNewManager();
System.out.println(number + "vip客户进来了,等待服务");
}
},
0,
6,
TimeUnit.SECONDS);
以上代码根据 用户量为 1: 6 :3的 量来模拟数字的产生。