------- <a target="blank">android培训</a>、<a target="blank">java培训</a>、期待与您交流! ----------
/**
* 银行业务调度系统
*
* 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
* 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
* 异步随机生成各种类型的客户,生成各类型用户的概率比例为:
* VIP客户 :普通客户 :快速客户 = 1 :6 :3。
* 客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
* 各类型客户在其对应窗口按顺序依次办理业务。
* 当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
* 随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
* 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
*
* 思路分析:
* 1,客户来了,取号排队,找的是取号的机器;生成的号码应该有VIP,快速和普通三种类型,是不是需要3个取号机器呢?平常,银行里只有一个取号的机器,
* 于是就想到可以搞一个号码管理器类,产生3个实例对象统一由取号的机器管理。
* 2,创建一个取号的机器,因为对象只有一个,要设计成单例模式,提供获取对应号码管理器类的对象方法。
* 3,创建一个号码管理器类,谁有数据=谁就提供方法,要提供一个取号的方法,不管你是什么类的客户号码,都有取号的方法。
* 属性有什么呢?
* 要有一个存储号码的集合,搞到这里,后面服务窗口怎么知道要叫哪个号码服务,肯定是问号码管理器,谁有数据=谁就提供方法,还要有个提供下一个服务信息号码的方法。
* 4,创建窗口类,属性很简单有两个,一个编号,一个类型就可以。
* 窗口做什么?服务客户,不断找号码管理器的方法获得下一个服务号码,有就开始服务。
* 5,主函数,创建窗口的实例对象,并对其配置编号和类型,再用3个线程产生客户,就是调用号码管理器的取号方法。
*
*
* 总结:
* 1,刚刚首分析程序显示的结果,一直没有快速窗口为普通客户服务的情况,可是找到了VIP窗口给普通客户服务的情况,我坚信程序没问题。
* 运行了很久还是碰不到我想要的情况,最最后减少了几个普通窗口的数量,这样普通客户的服务就会相对变得紧张,其他窗口空闲时获取到普通客户的概率就很大大增加,果然一下子就看到了我想要的结果。
* 2,首先还是看了张老师讲解才会做的,之前只能开个门,无法分析其中的面向对象之间的关系,之后再写的过程中也是遇到过问题,主要的核心应该就是NumberMachine和NumberManager这两
* 个类的理解,开始我真是分析不出来。就连张孝祥老师也说这是一种境界之后的领悟,我还差的很远呢。
* 3,再者,对Servicewindow类也蛮有感悟,感觉一下子对面向对象又有了一个新的理解,新的提升,你看,服务窗口,都有两个基本属性,编号和类型。
* 这是他们的共同点。还有NumberManager类,有三个对象,都有取号和返回下一个服务号码的功能。不管是ServiceWindow还是NumberManager,他们的实例对象的资源都是独立的,能这样去
* 做设计恐怕这就是传说中的面向对象的思想设计模式吧。
*/
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MainClass {
public static void main(String[] args) {
// 创建4个普通窗口
for (int i = 1; i < 5; i++) {
ServiceWindow commonWindow = new ServiceWindow();
commonWindow.setType(CustomerType.COMMON);
commonWindow.setNumber(i);
commonWindow.start();
}
// 创建一个快速窗口
ServiceWindow experssWindow = new ServiceWindow();
experssWindow.setNumber(5);
experssWindow.setType(CustomerType.EXPERSS);
experssWindow.start();
// 创建一个VIP窗口
ServiceWindow vipWindow = new ServiceWindow();
vipWindow.setNumber(6);
vipWindow.setType(CustomerType.VIP);
vipWindow.start();
// 每一秒出现一位普通客户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
public void run() {
int serviceNumber = NumberMachine.getInstance()
.getCommonManager().generateNumber();
System.out.println(serviceNumber + "号普通客户正在等待服务中");
}
}, 0, 1, TimeUnit.SECONDS);
// 每2秒出现一位快速客户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
public void run() {
int serviceNumber = NumberMachine.getInstance()
.getExperssManager().generateNumber();
System.out.println(serviceNumber + "号快速客户正在等待服务中");
}
}, 0, 2, TimeUnit.SECONDS);
// 每6秒出现一位VIP客户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
public void run() {
int serviceNumber = NumberMachine.getInstance()
.getVipManager().generateNumber();
System.out.println(serviceNumber + "号VIP客户正在等待服务中");
}
}, 0, 6, TimeUnit.SECONDS);
}
}
==================================================================================
package com.itcast.interview.bankqueue;
public class NumberMachine {
/* 单例模式创建一个取号机器实例对象 */
private NumberMachine() {
}
private static NumberMachine instance = new NumberMachine();
public static NumberMachine getInstance() {
return instance;
}
/* 创建三个号码管理器引用对象 */
private NumberManager commonManager = new NumberManager();
private NumberManager experssManager = new NumberManager();
private NumberManager vipManager = new NumberManager();
/* 提供获取号码管理器的方法 */
public NumberManager getCommonManager() {
return commonManager;
}
public NumberManager getExperssManager() {
return experssManager;
}
public NumberManager getVipManager() {
return vipManager;
}
}
===========================================================================
package com.itcast.interview.bankqueue;
import java.util.ArrayList;
import java.util.List;
public class NumberManager {
private Integer lastNumber = 0;
private List<Integer> queueNumbers = new ArrayList<Integer>();
// 客户取号
public synchronized Integer generateNumber() {
queueNumbers.add(++lastNumber);
return lastNumber;
}
// 提供下一个服务号码
public synchronized Integer fetchNumber() {
if (queueNumbers.size() > 0)
return queueNumbers.remove(0);
else
return null;
}
}
=================================================================
package com.itcast.interview.bankqueue;
import java.util.Random;
import java.util.concurrent.Executors;
public class ServiceWindow {
// 窗口两个属性:窗口编号,窗口的类型
private int number = 1;
private CustomerType type = CustomerType.COMMON;
public void setType(CustomerType type) {
this.type = type;
}
public void setNumber(int number) {
this.number = number;
}
public CustomerType getType() {
return this.type;
}
public void start() {
Executors.newSingleThreadExecutor().execute(new Runnable() {
public void run() {
while (true) {
switch (type) {
case COMMON:
commonService();
break;
case EXPERSS:
experssService();
break;
case VIP:
vipService();
break;
}
}
}
});
}
// 普通服务窗口
private void commonService() {
String windowName = "第" + number + "号" + type + "窗口";
System.out.println(windowName + "正在获取普通任务");
Integer serviceNumber = NumberMachine.getInstance().getCommonManager()
.fetchNumber();
if (serviceNumber != null) {
System.out.println(windowName + "获取到了" + "第" + serviceNumber
+ "号普通任务");
int maxRandom = Constant.MAX_SERVICE_TIME
- Constant.MIN_SERVICE_TIME;
int serviceTime = new Random().nextInt(maxRandom)
+ Constant.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
}
System.out.println(windowName + "为" + "第" + serviceNumber
+ "号普通客户服务结束,------------->耗时" + serviceTime + "秒");
} else {
System.out.println(windowName + "没有获取到普通任务,先休息1秒嘛!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
// 快速服务窗口
private void experssService() {
String windowName = "第" + number + "号" + type + "窗口";
System.out.println(windowName + "正在获取快速任务");
Integer serviceNumber = NumberMachine.getInstance().getExperssManager()
.fetchNumber();
if (serviceNumber != null) {
System.out.println(windowName + "获取到了" + "第" + serviceNumber
+ "号快速任务");
int serviceTime = Constant.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
}
System.out.println(windowName + "为" + "第" + serviceNumber
+ "号快速客户服务结束,------------->耗时" + serviceTime + "秒");
} else {
System.out.println(windowName + "没有获取到快速任务");
commonService();
}
}
// VIP服务窗口
private void vipService() {
String windowName = "第" + number + "号" + type + "窗口";
System.out.println(windowName + "正在获取VIP任务");
Integer serviceNumber = NumberMachine.getInstance().getVipManager()
.fetchNumber();
if (serviceNumber != null) {
System.out.println(windowName + "获取到了" + "第" + serviceNumber
+ "号VIP任务");
int maxRandom = Constant.MAX_SERVICE_TIME
- Constant.MIN_SERVICE_TIME;
int serviceTime = new Random().nextInt(maxRandom)
+ Constant.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
}
System.out.println(windowName + "为" + "第" + serviceNumber
+ "号VIP客户服务结束,------------->耗时" + serviceTime + "秒");
} else {
System.out.println(windowName + "没有获取到VIP任务");
commonService();
}
}
}
============================================================================
package com.itcast.interview.bankqueue;
public enum CustomerType {
COMMON, EXPERSS, VIP;
public String toString() {
switch (this) {
case COMMON:
return "普通";
case EXPERSS:
return "快速";
case VIP:
return "VIP";
}
return null;
}
}
=============================================================================
package com.itcast.interview.bankqueue;
public class Constant
{
static int MAX_SERVICE_TIME=10;
static int MIN_SERVICE_TIME=1;
}
==========================================================================
LOG
第1号普通窗口正在获取普通任务
第6号VIP窗口正在获取VIP任务
第5号快速窗口正在获取快速任务
第1号普通窗口没有获取到普通任务,先休息1秒嘛!
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口没有获取到普通任务,先休息1秒嘛!
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口没有获取到普通任务,先休息1秒嘛!
1号普通客户正在等待服务中
1号快速客户正在等待服务中
1号VIP客户正在等待服务中
第6号VIP窗口正在获取VIP任务
第6号VIP窗口获取到了第1号VIP任务
第5号快速窗口正在获取快速任务
第5号快速窗口获取到了第1号快速任务
第1号普通窗口正在获取普通任务
第1号普通窗口获取到了第1号普通任务
2号普通客户正在等待服务中
第5号快速窗口为第1号快速客户服务结束,------------->耗时1秒
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口获取到了第2号普通任务
第1号普通窗口为第1号普通客户服务结束,------------->耗时7秒
第1号普通窗口正在获取普通任务
第1号普通窗口没有获取到普通任务,先休息1秒嘛!
第5号快速窗口为第2号普通客户服务结束,------------->耗时8秒
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口没有获取到普通任务,先休息1秒嘛!
第6号VIP窗口为第1号VIP客户服务结束,------------->耗时9秒
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口没有获取到普通任务,先休息1秒嘛!
3号普通客户正在等待服务中
2号快速客户正在等待服务中
第1号普通窗口正在获取普通任务
第1号普通窗口获取到了第3号普通任务
第5号快速窗口正在获取快速任务
第5号快速窗口获取到了第2号快速任务
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口没有获取到普通任务,先休息1秒嘛!
第5号快速窗口为第2号快速客户服务结束,------------->耗时1秒
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口没有获取到普通任务,先休息1秒嘛!
第1号普通窗口为第3号普通客户服务结束,------------->耗时9秒
第1号普通窗口正在获取普通任务
第1号普通窗口没有获取到普通任务,先休息1秒嘛!
4号普通客户正在等待服务中
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口获取到了第4号普通任务
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口没有获取到普通任务,先休息1秒嘛!
第6号VIP窗口为第4号普通客户服务结束,------------->耗时6秒
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口没有获取到普通任务,先休息1秒嘛!
第1号普通窗口正在获取普通任务
第1号普通窗口没有获取到普通任务,先休息1秒嘛!
5号普通客户正在等待服务中
3号快速客户正在等待服务中
第5号快速窗口正在获取快速任务
第5号快速窗口获取到了第3号快速任务
第5号快速窗口为第3号快速客户服务结束,------------->耗时1秒
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口获取到了第5号普通任务
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口没有获取到普通任务,先休息1秒嘛!
第5号快速窗口为第5号普通客户服务结束,------------->耗时2秒
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口没有获取到普通任务,先休息1秒嘛!
第1号普通窗口正在获取普通任务
第1号普通窗口没有获取到普通任务,先休息1秒嘛!
6号普通客户正在等待服务中
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口获取到了第6号普通任务
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口没有获取到普通任务,先休息1秒嘛!
第1号普通窗口正在获取普通任务
第1号普通窗口没有获取到普通任务,先休息1秒嘛!
第6号VIP窗口为第6号普通客户服务结束,------------->耗时4秒
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口没有获取到普通任务,先休息1秒嘛!
7号普通客户正在等待服务中
4号快速客户正在等待服务中
2号VIP客户正在等待服务中
第5号快速窗口正在获取快速任务
第5号快速窗口获取到了第4号快速任务
第5号快速窗口为第4号快速客户服务结束,------------->耗时1秒
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口获取到了第7号普通任务
第1号普通窗口正在获取普通任务
第1号普通窗口没有获取到普通任务,先休息1秒嘛!
第6号VIP窗口正在获取VIP任务
第6号VIP窗口获取到了第2号VIP任务
第5号快速窗口为第7号普通客户服务结束,------------->耗时4秒
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口没有获取到普通任务,先休息1秒嘛!
第6号VIP窗口为第2号VIP客户服务结束,------------->耗时5秒
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口没有获取到普通任务,先休息1秒嘛!
------- <a target="blank">android培训</a>、<a target="blank">java培训</a>、期待与您交流! ----------