项目分析:
银行窗口 三类窗口
客户 三类客户
客户随机生成
生成比例 1:6:3
窗口可以向下兼容,
各类型客户应在其对应窗口顺序依次办理业务, 需要有窗口叫号控制器
实际代码设计:
首先先编号码管理器NumberManager
变量类型尽量面向父级,体现面向接口编程
ArrayList remove返回类型是他取走的数据类型
为了达到多线程操作的时候应让其互斥,加synchronized
1、号码生成器
/*
* 号码生成器
*/
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) {
number = queueNumber.remove(0);
}
return number;
}
}
号码管理器:
/**
* 号码管理器
*/
//定义用户级别
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();
}
服务窗口
使用JDK1.5新的线程方式不仅可以使性能更好、而且还可以体现出自己懂得多
if else 为什么比switch 效率高
比如if(a==2)else if(a==3) 这样a需要请求多次值、系统不知道这两个a是同一个a
这样switch就体现出它只用一次值就可以达到if else的效果 所以switch效率高
/**
* 服务窗口
*
**/
//定义常量类的默认值和窗口序号
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;
}
public void start() {
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
while (true) {
switch (type) {
case COMMON:
commonService();
break;
case EXPERSS:
expressService();
break;
case VIP:
vipService();
break;
}
}
}
});
}
//普通窗口业务逻辑
private void commonService() {
String windowName = "第" + windowId + "号" + type + "窗口";
//获取号码
Integer number = NumberMachine.getInstance().getCommonManager()
.fetchServiceNumber();
System.out.println(windowName + "正在获取任务");
if (number != null) {
System.out
.println(windowName + "为第" + number + "个" + "普通" + "客户服务");
long beginTime = System.currentTimeMillis();
//生成随机等待时间
int maxRand = Constants.MAX_SERVICE_TIME
- Constants.MIN_SERVICE_TIME;
long serveTime = new Random().nextInt(maxRand) + 1
+ Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime = System.currentTimeMillis() - beginTime;
System.out.println(windowName + "为第" + number + "个" + "普通"
+ "完成服务,耗时" + costTime / 1000 + "秒");
} else {
System.out.println(windowName + "没有获取到任务,休息一秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void expressService() {
String windowName = "第" + windowId + "号" + type + "窗口";
Integer number = NumberMachine.getInstance().getExpressManager()
.fetchServiceNumber();
System.out.println(windowName + "正在获取任务");
if (number != null) {
System.out
.println(windowName + "为第" + number + "个" + type + "客户服务");
long beginTime = System.currentTimeMillis();
try {
Thread.sleep(Constants.MIN_SERVICE_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime = System.currentTimeMillis() - beginTime;
System.out.println(windowName + "为第" + number + "个" + type
+ "完成服务,耗时" + costTime / 1000 + "秒");
} else {
System.out.println(windowName + "没有获取到任务");
commonService();
}
}
private void vipService() {
String windowName = "第" + windowId + "号" + type + "窗口";
System.out.println(windowName + "正在获取任务");
Integer number = NumberMachine.getInstance().getVipManager()
.fetchServiceNumber();
System.out.println(windowName + "正在获取任务");
if (number != null) {
System.out
.println(windowName + "为第" + number + "个" + type + "客户服务");
long beginTime = System.currentTimeMillis();
try {
Thread.sleep(Constants.MIN_SERVICE_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime = System.currentTimeMillis() - beginTime;
System.out.println(windowName + "为第" + number + "个" + type
+ "完成服务,耗时" + costTime / 1000 + "秒");
} else {
System.out.println(windowName + "没有获取到任务");
commonService();
}
}
}
运行测试拉~~
Main
public class MainClass {
/**
* @param args
*/
public static void main(String[] args) {
// 生成五个普通窗口
for (int i = 1; i < 5; i++) {
ServiceWindow commonWindow = new ServiceWindow();
commonWindow.setWindowId(i);
commonWindow.start();
}
// 生成一个快速窗口
ServiceWindow expressWindow = new ServiceWindow();
expressWindow.setType(CustomerType.EXPERSS);
expressWindow.start();
// 生成一个VIP窗口
ServiceWindow vipWindow = new ServiceWindow();
vipWindow.setType(CustomerType.VIP);
vipWindow.start();
// 新技术使每隔N长时间产生普通用户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Integer number = NumberMachine.getInstance().getCommonManager()
.generateNewManager();
System.out.println("第" + number + "号普通客户等待服务");
}
}, 0, Constants.COMMON_CUSTOMER_TIME, TimeUnit.SECONDS);
// 新技术使每隔N长时间产生快速用户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Integer number = NumberMachine.getInstance()
.getExpressManager().generateNewManager();
System.out.println("第" + number + "号快速客户等待服务");
}
}, 0, Constants.COMMON_CUSTOMER_TIME * 6, TimeUnit.SECONDS);
// 新技术使每隔N长时间产生VIP用户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Integer number = NumberMachine.getInstance().getVipManager()
.generateNewManager();
System.out.println("第" + number + "号vip客户等待服务");
}
}, 0, Constants.COMMON_CUSTOMER_TIME * 2, TimeUnit.SECONDS);
}
}
测试结果:
第1号VIP窗口正在获取任务
第1号快速窗口正在获取任务
第4号普通窗口正在获取任务
第1号快速窗口没有获取到任务
第2号普通窗口正在获取任务
第1号普通窗口正在获取任务
第3号普通窗口正在获取任务
第1号VIP窗口正在获取任务
第3号普通窗口没有获取到任务,休息一秒
第1号普通窗口没有获取到任务,休息一秒
第2号普通窗口没有获取到任务,休息一秒
第1号快速窗口正在获取任务
第4号普通窗口没有获取到任务,休息一秒
第1号快速窗口没有获取到任务,休息一秒
第1号VIP窗口没有获取到任务
第1号VIP窗口正在获取任务
第1号VIP窗口没有获取到任务,休息一秒
第1号普通客户等待服务
第1号快速客户等待服务
第1号vip客户等待服务
第4号普通窗口正在获取任务
第1号快速窗口正在获取任务
第1号VIP窗口正在获取任务
第1号普通窗口正在获取任务
第3号普通窗口正在获取任务
第2号普通窗口正在获取任务
第3号普通窗口没有获取到任务,休息一秒
第1号普通窗口没有获取到任务,休息一秒
第1号VIP窗口正在获取任务
第1号快速窗口为第1个快速客户服务
第4号普通窗口为第1个普通客户服务
第1号VIP窗口为第1个VIP客户服务
第2号普通窗口没有获取到任务,休息一秒
第2号普通客户等待服务
第3号普通窗口正在获取任务
第1号快速窗口为第1个快速完成服务,耗时1秒
第1号快速窗口正在获取任务
第1号普通窗口正在获取任务
第1号快速窗口没有获取到任务
第1号快速窗口正在获取任务
第3号普通窗口为第2个普通客户服务
第3号普通客户等待服务
第1号快速窗口没有获取到任务,休息一秒
第2号普通窗口正在获取任务
第1号VIP窗口为第1个VIP完成服务,耗时1秒
第1号普通窗口没有获取到任务,休息一秒
第1号VIP窗口正在获取任务
第2号vip客户等待服务
第2号普通窗口没有获取到任务,休息一秒
第1号VIP窗口正在获取任务
第1号VIP窗口为第2个VIP客户服务
第1号快速窗口正在获取任务
第4号普通客户等待服务
第1号快速窗口没有获取到任务
第1号快速窗口正在获取任务
第1号快速窗口为第3个普通客户服务
第1号普通窗口正在获取任务
第1号普通窗口为第4个普通客户服务
第2号普通窗口正在获取任务
第1号VIP窗口为第2个VIP完成服务,耗时1秒
第2号普通窗口没有获取到任务,休息一秒
第1号VIP窗口正在获取任务
第1号VIP窗口正在获取任务
第1号VIP窗口没有获取到任务
第1号VIP窗口正在获取任务
第1号VIP窗口没有获取到任务,休息一秒
第5号普通客户等待服务
第3号vip客户等待服务
第1号VIP窗口正在获取任务
第2号普通窗口正在获取任务
第1号VIP窗口正在获取任务
第2号普通窗口为第5个普通客户服务
第1号VIP窗口为第3个VIP客户服务
第3号普通窗口为第2个普通完成服务,耗时2秒
第3号普通窗口正在获取任务
第3号普通窗口没有获取到任务,休息一秒
第6号普通客户等待服务
第1号VIP窗口为第3个VIP完成服务,耗时1秒