//首先生成个list集合 自动生成的号码都放在集合里 每次都用remove获取,这样有序的取号
public class NumberManager {
private int lastNumber=0;
private List queueNumbers = new ArrayList();
public synchronized Integer generateNewNumber(){
queueNumbers.add(++lastNumber);
return lastNumber;
}
public synchronized Integer fetchNumber(){
if(queueNumbers.size()>0){
return (Integer) queueNumbers.remove(0);
}else{
System.out.println("现在没有号码在队列");
return null;
}
}
}
//上面的是号码生成器 当然要有取号机了 ,有3种客户呦 骚年
public class NumberMachine {
//大家都知道的 单例 为了线程安全
private static NumberMachine instance = new NumberMachine();
public NumberMachine(){
}
public static NumberMachine getInstance(){
return instance;
}
private NumberManager commonManager = new NumberManager();//普通客户
private NumberManager expressManager = new NumberManager();//快速客户
private NumberManager vipManager = new NumberManager();//vip客户
public NumberManager getCommonManager() {
return commonManager;
}
public NumberManager getExpressManager() {
return expressManager;
}
public NumberManager getVipManager() {
return vipManager;
}
}
//枚举一下 三种客户类型 方便调用
public enum CustomerType {
COMMON,EXPRESS,VIP;
public String toString(){
String name = null;
switch(this){
case COMMON:
name = "普通";
break;
case EXPRESS:
name = "快速";
break;
case VIP:
name = name();
break;
}
return name;
}
}
//对于三种窗口的无限循环 到下班 只要里面集合里面有值就被获取到 然后被窗口喊去办理
public class ServiceWindow {
private static Logger logger=Logger.getLogger("bank");
private CustomerType type=CustomerType.COMMOM;
private int number=1;
public CustomerType getType() {
return type;
}
public void setType(CustomerType type) {
this.type = type;
}
public void setNumber(int number) {
this.number = number;
}
public void start(){
Executors.newSingleThreadExecutor().execute(new Runnable() {
public void run() {
while(true){
switch(type){
case COMMOM:
commonService();
break;
case EXPRESS:
expressService();
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 serviceTime = new Random().nextInt(10);//服务了多长时间
try {
Thread.sleep(serviceTime*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(windowName+"完成为第"+serviceNumber+"号普通客户服务,总共耗时"+serviceTime+"秒");
}else{
System.out.println(windowName+"没有取到普通任务,正在空闲一秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
commonService();
}
}
//===========================================
private void expressService() {
String windowName="第"+number+"号"+type+"窗口";
System.out.println(windowName+"开始获取快速任务");
Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber();
if(serviceNumber!=null){
System.out.println(windowName+"开始为第"+serviceNumber+"号快速客户服务" );
int serviceTime = new Random().nextInt(2);//服务了多长时间
try {
Thread.sleep(serviceTime*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(windowName+"完成为第"+serviceNumber+"号快速客户服务,总共耗时"+serviceTime+"秒");
}else{
System.out.println(windowName+"没有取到快速任务,正在获取普通任务");
commonService();
}
}
//--------------------------------------------
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 serviceTime = new Random().nextInt(20);//服务了多长时间
try {
Thread.sleep(serviceTime*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(windowName+"完成为第"+serviceNumber+"号vip客户服务,总共耗时"+serviceTime+"秒");
}else{
System.out.println(windowName+"没有取到vip任务,正在获取普通任务");
commonService();
}
}
}
//咱测试一下 ,建3个定时器 循环生成客户
public class test {
private static Logger logger=Logger.getLogger("bank");
public static void main(String[] args) {
for(int i=1;i<5;i++){
ServiceWindow window = new ServiceWindow();
window.setNumber(i);
window.start();
}
ServiceWindow expressWindow = new ServiceWindow();
expressWindow.setType(CustomerType.EXPRESS);
expressWindow.start();
ServiceWindow vipWindow = new ServiceWindow();
vipWindow.setType(CustomerType.VIP);
vipWindow.start();
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
public void run() {
Integer servicenumber = NumberMachine.getInstance().getCommonManager().generateNewNumber();
System.out.println("第"+servicenumber+"号普通客户取号了");
}
}, 0, 1,TimeUnit.SECONDS);
//-------------------------------------------
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
public void run() {
Integer servicenumber = NumberMachine.getInstance().getExpressManager().generateNewNumber();
System.out.println("第"+servicenumber+"号快速客户取号了");
}
}, 0, 3,TimeUnit.SECONDS);
//-------------------------------------------
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
public void run() {
Integer servicenumber = NumberMachine.getInstance().getVipManager().generateNewNumber();
System.out.println("第"+servicenumber+"号vip客户取号了");
}
}, 0, 6,TimeUnit.SECONDS);
}
}