看了张考祥的视频后,自已动手来做了一个银行业务系统模拟
需求的和张老师的视频中的一样其它不多说了来代码
写一个顾客的枚举
public enum CustomerType {
GENERAL, RAPIDBUSINESS, VIP;
@Override
public String toString() {
switch (this) {
case GENERAL:
return "普通";
case RAPIDBUSINESS:
return "快速业务";
case VIP:
return "VIP";
}
return super.toString();
}
}
写一个号码机器类(一个银行只有一个叫号机,采用单例设计模式)管理3个队列用ArrayList装载数据,并在号码机器类的构造函数中随机生成顾客
import java.util.ArrayList;
import java.util.Random;
public class NumberMachine {
private ArrayList
private ArrayList
private ArrayList
private static NumberMachine instance = new NumberMachine();
private int generalNumber = 1;
private int rapidNumber = 1;
private int vipNumber = 1;
public static NumberMachine getInstance() {
return instance;
}
// 获取顾客号码函数号码存在ArrayList中
//多线程安全加上同步锁
public synchronized Integer getGeneralNumber() {
if (generalQueue.isEmpty())
return null;
return generalQueue.remove(0);
}
public Integer getRapidNumber() {
if (rapidQueue.isEmpty())
return null;
return rapidQueue.remove(0);
}
public synchronized Integer getVipNumber() {
if (vipQueue.isEmpty())
return null;
return vipQueue.remove(0);
}
private synchronized NumberMachine() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
// 进来一个顾客后一秒后再来一个循环
genCustomer();
// 3个集合装的数据代表顾客数如果大于50提示人太多
int sum = generalQueue.size() + rapidQueue.size()
+ vipQueue.size();
if (sum > 50) {
System.out.println("人太多了,请你多等一会");
try {
Thread.sleep(10000);// 人太多了休息10秒
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println(sum+"人在排队等待服务");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
// 生成顾客函数
private void genCustomer() {
// 随机生顾客的比例GENERAL:RAPIDBUSINESS:VIP是1:3:6
int ranint = new Random().nextInt(10);
switch (ranint) {
case 0:// 来10个只有一个是VIP
vipQueue.add(vipNumber++);
break;
case 1:// 来10个有3个是RAPIDbUSINESS
case 2:
case 3:
rapidQueue.add(rapidNumber++);
break;
default:// 其它的是GENERAL
generalQueue.add(generalNumber++);
}
}
}
写一个银行窗口服务类,并在构造函数中开启服务,
import java.util.Random;
public class ServiceWindow {
public ServiceWindow(final CustomerType customerType, final int windowId) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
server(customerType, windowId);
}
}
}).start();
}
//银行窗口服务函数
private void server(CustomerType customerType, int windowId) {
String windowName = "第" + windowId +"号"+ customerType.toString() + "窗口";
System.out.println(windowName + "正在获取服务");
Integer number = null;
switch (customerType) {
case GENERAL:
number = NumberMachine.getInstance().getGeneralNumber();
service( windowName, CustomerType.GENERAL,number);
break;
case RAPIDBUSINESS:
number = NumberMachine.getInstance().getRapidNumber();
if (number != null) {//获取快速业务顾客
service( windowName, CustomerType.RAPIDBUSINESS,number);
} else {//快速业务没顾客时获取普通业务顾客
number = NumberMachine.getInstance().getGeneralNumber();
service( windowName, CustomerType.GENERAL,number);
}
break;
case VIP:
number = NumberMachine.getInstance().getVipNumber();
if (number != null) {//获取VIP客户
service( windowName, CustomerType.VIP,number);
} else {//没VIP客户时获取普通业务顾客
number = NumberMachine.getInstance().getGeneralNumber();
service( windowName, CustomerType.GENERAL,number);
}
}
}
//窗口服务客户的函数
public void service(String windowName,CustomerType customerType,
Integer number) {
if (number != null) {
System.out.println(windowName + "正在为第" + number + "号"+customerType.toString()+"客户服务...");
spendTime(windowName, customerType, number);
} else{
System.out.println(windowName + "没有服务对象,休息1秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 随机生成客户服务时间
public void spendTime(String windowName, CustomerType customerType,
Integer number) {
long serviceTime = 0;
long beginTime = System.currentTimeMillis();
if (customerType == CustomerType.RAPIDBUSINESS) {
serviceTime = Constants.MIN_SERVICE_TIME;
} else {
int random = new Random().nextInt(Constants.MAX_SERVICE_TIME) + 1;
serviceTime = (random < Constants.MIN_SERVICE_TIME ? Constants.MIN_SERVICE_TIME
: random);
}
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
System.out.println("出错了" + e);
}
long costTime = System.currentTimeMillis() - beginTime;
System.out.println(windowName + "为" + number+"号 "+ customerType.toString()
+ "客户完成服务,耗时:" + (costTime / 1000) + "秒。。。。。。");
}
}
常量类
public class Constants {
public static int MAX_SERVICE_TIME=10000;//最大服务时间毫秒
public static int MIN_SERVICE_TIME=1000;//最小服务时间毫秒
}
写一个银行主类调用窗口服务,启动叫号机
public class Banker {
/**
* @param args
* @author zhang wei feng
* @QQ:404486310
*/
public static void main(String[] args) {
System.out.println("银行开始营业了!");
//开启4个普通窗口
for (int i = 1; i <= 4; i++) {
new ServiceWindow(CustomerType.GENERAL, i);
}
//开启一个快速业务窗口
new ServiceWindow(CustomerType.RAPIDBUSINESS, 5);
//开启一个VIP窗口
new ServiceWindow(CustomerType.VIP, 6);
//启动叫号机
NumberMachine.getInstance();
}
}
部分运行结果如下
第5号快速业务窗口为14号 快速业务客户完成服务,耗时:1秒。。。。。。
第5号快速业务窗口正在获取服务
第5号快速业务窗口正在为第39号普通客户服务...
第3号普通窗口正在获取服务
第3号普通窗口没有服务对象,休息1秒
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
1人在排队等待服务
第3号普通窗口正在获取服务
第3号普通窗口正在为第40号普通客户服务...
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
1人在排队等待服务
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
2人在排队等待服务
第3号普通窗口为40号 普通客户完成服务,耗时:1秒。。。。。。
第3号普通窗口正在获取服务
第3号普通窗口没有服务对象,休息1秒
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
3人在排队等待服务
第3号普通窗口正在获取服务
第3号普通窗口正在为第41号普通客户服务...
第2号普通窗口为36号 普通客户完成服务,耗时:9秒。。。。。。
第2号普通窗口正在获取服务
第2号普通窗口没有服务对象,休息1秒
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
3人在排队等待服务
第2号普通窗口正在获取服务
第2号普通窗口没有服务对象,休息1秒
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
4人在排队等待服务
第3号普通窗口为41号 普通客户完成服务,耗时:1秒。。。。。。
第3号普通窗口正在获取服务
第3号普通窗口正在为第42号普通客户服务...
第4号普通窗口为37号 普通客户完成服务,耗时:9秒。。。。。。
第4号普通窗口正在获取服务
第4号普通窗口没有服务对象,休息1秒
第2号普通窗口正在获取服务
第2号普通窗口没有服务对象,休息1秒
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
4人在排队等待服务
第4号普通窗口正在获取服务
第4号普通窗口没有服务对象,休息1秒
第2号普通窗口正在获取服务
第2号普通窗口没有服务对象,休息1秒
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
5人在排队等待服务
第6号VIP窗口为38号 普通客户完成服务,耗时:9秒。。。。。。
第6号VIP窗口正在获取服务
第6号VIP窗口正在为第9号VIP客户服务...
第5号快速业务窗口为39号 普通客户完成服务,耗时:7秒。。。。。。
第5号快速业务窗口正在获取服务
第5号快速业务窗口正在为第15号快速业务客户服务...