}package cn.itheima.bank;
/**客户类,用枚举*/
public enum CustomerType {
COMMON, EXPRESS, VIP;
@Override
public String toString() {
switch (this) {
case COMMON:
return "普通";
case EXPRESS:
return "快速";
case VIP:
return name();
}
return null;
}
}
package cn.itheima.bank;
/**号码管理器*/
public class NumberMachine {
// 生成3中类型的管理器
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 nuberMachine;
}
//创建一个静态的号码管理器
private static NumberMachine nuberMachine = new NumberMachine();
}
package cn.itheima.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 generateManager() {
queueNumber.add(++lastNumber);
return lastNumber;
}
// 找号码
public synchronized Integer fechServcieNumber() {
if(queueNumber.size()>0){
return queueNumber.remove(0);
}else{
return null;
}
}
}
package cn.itheima.bank;
/**服务窗口类*/
import java.util.Random;
import java.util.concurrent.Executors;
public class ServiceWindow {
// 窗口类型
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 EXPRESS:
expressService();
break;
case VIP:
vipService();
break;
}
}
}
});
}
// 普通用户
private void commonService() {
String windowName = "第" + windowId + "号" + type + "窗口";
System.out.println(windowName + "开始获取任务");
Integer serviceNumber = NumberMachine.getInstance().getCommonManager()
.fechServcieNumber();
if (serviceNumber != null) {
System.out.println(windowName + "开始为" + serviceNumber + "号" + type
+ "客户服务");
// 服务用时
int MaxRandom = Constants.MAX_SERVICE_TIME
- Constants.MIN_SERVICE_TIME;
int serviceTime = new Random().nextInt(MaxRandom) + 1
+ Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(windowName + "完成为第" + serviceNumber
+ "号普通客户服务,总共耗时" + serviceTime / 1000 + "秒");
} else {
System.out.println(windowName + "没有取到" + type + "任务,正在空闲一秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// VIP用户
private void vipService() {
String windowName = "第" + windowId + "号" + type + "窗口";
System.out.println(windowName + "开始获取任务");
Integer serviceNumber = NumberMachine.getInstance().getVipManager()
.fechServcieNumber();
if (serviceNumber != null) {
System.out.println(windowName + "开始为" + serviceNumber + "号" + type
+ "客户服务");
// 服务用时
int MaxRandom = Constants.MAX_SERVICE_TIME
- Constants.MIN_SERVICE_TIME;
int serviceTime = new Random().nextInt(MaxRandom) + 1
+ Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(windowName + "完成为第" + serviceNumber
+ "号普通客户服务,总共耗时" + serviceTime / 1000 + "秒");
} else {
System.out.println(windowName + "没有取到" + type + "任务");
commonService();
}
}
// 快速用户
private void expressService() {
String windowName = "第" + windowId + "号" + type + "窗口";
System.out.println(windowName + "开始获取任务");
Integer serviceNumber = NumberMachine.getInstance().getExpressManager()
.fechServcieNumber();
if (serviceNumber != null) {
System.out.println(windowName + "开始为" + serviceNumber + "号" + type
+ "客户服务");
// 服务用时
int MaxRandom = Constants.MAX_SERVICE_TIME
- Constants.MIN_SERVICE_TIME;
int serviceTime = new Random().nextInt(MaxRandom) + 1
+ Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(windowName + "完成为第" + serviceNumber
+ "号普通客户服务,总共耗时" + serviceTime / 1000 + "秒");
} else {
System.out.println(windowName + "没有取到" + type + "任务");
commonService();
}
}
}