能运行出来,但是有点小错误啊,盯了半天了,也不知道是哪出了问题,求助啊!
下边是我的运行结果:
第1号的COMMON窗口开始获取普通任务!按说这里应该返回的是“普通”的,就是这
第2号的COMMON窗口开始获取普通任务!
第1号的VIP窗口正在获取任务
第3号的COMMON窗口开始获取普通任务!
第1号的EXPRESS窗口正在获取任务
第4号的COMMON窗口开始为3号普通客户服务
4号普通客户正在等待服务!
5号普通客户正在等待服务!
6号普通客户正在等待服务!
我感觉在ServiceWindow这个类中的
setType()这个方法当中,有点问题,它是怎么和枚举到那个类给关联起来的啊?
package com.itcast.band;
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 generateNewManager()
{
queueNumber.add(LastNumber);
return LastNumber++;
}
public synchronized Integer fetchServiceNumber()
{
if(queueNumber.size()>0)
{
return (Integer)queueNumber.remove(0);
}
else
{
return null;
}
}
}
package com.itcast.band;
/*
* 编写表示号码机器的类*/
public class NumberMachine
{
private NumberManager CommonManager = new NumberManager();
private NumberManager ExpressManager = new NumberManager();
private NumberManager VIPManager = new NumberManager();
public NumberManager getCommonManager()
{
return CommonManager; //注意看它的返回值是NumberManager类的成员,可以使用NumberManager当中的方法
}
public NumberManager getExpressManager()
{
return ExpressManager;
}
public NumberManager getVIPManager()
{
return VIPManager;
}
/*定义一个单例模式:只能new一个对象*/
private NumberMachine(){};
private static NumberMachine instance = new NumberMachine();
public static NumberMachine getInstance()
{
return instance;
}
}
package com.itcast.band;
import java.util.Random; //Random
import java.util.concurrent.Executors;
/*窗口前有 “第 ” xx 号
客户前没有 “第” , 直接就是 xx号 客户
有一个小问题: 各种类型用户的中文名称获取不到*/
public class ServiceWindow
{
private CustomerTypes type = CustomerTypes.COMMON; //定义一个来表示是哪个窗口的服务类型 customerTypes //默认值
private int WindowId = 1; //定义一个窗口号,在这里我们用到set方法而不是把它作为构造方法的参数,是为了提高代码的复用性。
public void setType(CustomerTypes type)
{
this.type = type;
}
public void setWindowId(int windowId)
{
this.WindowId = windowId;
}
public void start()
{
Executors.newSingleThreadExecutor().execute(new Runnable()
{
public void run()
{
/*
* 取号
* 从这里我们需要比较的if else和switch的区别
* switch语句中的条件我们除了可以放int类型额之外我们还可以放enum枚举类型的*/
while(true)
{
switch(type)
{
case COMMON:
commonServers();
break;
case EXPRESS:
expressServers();
/*我们在这不再重新定义而是进行二次封装,将它搞成了一个内部类
if(number!= null)
{
}
else
{
}
*/
break;
case VIP:
vipServer();
// Integer number2 = NumberMachine.getInstance().getVIPManager().fetchServiceNumber();
// if(number2 != null)
// {
//
// }
// else
// {
//
// }
break;
}
}
}
});
}
private void commonServers()
{
String WindowName = "第" + WindowId + "号的"+ type + "窗口";
System.out.println(WindowName + "开始获取普通任务!"); //定义一个顺序,来判断是谁在获取任务
Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber(); //取号
if(number != null)
{
System.out.println(WindowName+"开始为"+number+"号普通客户服务");
long beginTime = System.currentTimeMillis();
/*模拟服务:休息一段时间:
* 在这里我们都定义成了int类型的了*/
int maxRand = constants.MAX_SERVERS_TIME - constants.MIN_SERVER_TIME;
long serverTime = new Random().nextInt(maxRand) + 1 + constants.MIN_SERVER_TIME;
try
{
Thread.sleep(serverTime); /*服务期间让它休息1 - 10 秒钟*/
}
catch (InterruptedException e)
{
e.printStackTrace();
}
long costTime = System.currentTimeMillis() - beginTime;
System.out.println(WindowName + "为第" + number + "个" + type + "客户完成服务," + "耗时" + costTime/1000 + "秒");
}
else
{
System.out.println(WindowName+"没有获取到任务,休息一秒钟");
try
{
Thread.sleep(1000); /*让它休息1秒钟*/
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
private void vipServer()
{
String WindowName = "第" + WindowId + "号的"+ type + "窗口";
System.out.println(WindowName + "正在获取任务"); //定义一个顺序,来判断是谁在获取任务
Integer number = NumberMachine.getInstance().getVIPManager().fetchServiceNumber();
if(number != null)
{
System.out.println(WindowName + "开始为第" + number + "号VIP客户服务");
long beginTime = System.currentTimeMillis();
/*模拟服务:休息一段时间:
* 在这里我们都定义成了int类型的了*/
int maxRand = constants.MAX_SERVERS_TIME - constants.MIN_SERVER_TIME;
long serverTime = new Random().nextInt(maxRand) + 1 + constants.MIN_SERVER_TIME;
try
{
Thread.sleep(serverTime); /*让它休息1 - 10 秒钟*/
} catch (InterruptedException e)
{
e.printStackTrace();
}
long costTime = System.currentTimeMillis() - beginTime;
System.out.println(WindowName + "为第" + number + "个" + type + "客户完成服务," + "耗时" + costTime/1000 + "秒");
}
else
{
System.out.println(WindowName + "没有获取到VIP任务");
commonServers();
try
{
Thread.sleep(1000); /*让它休息1秒钟*/
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
private void expressServers()
{
String WindowName = "第" + WindowId + "号的"+ type + "窗口";
System.out.println(WindowName + "正在获取任务"); //定义一个顺序,来判断是谁在获取任务
Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber(); //需要改动
if(number != null)
{
System.out.println(WindowName + "开始为第" + number + "号快速客户服务");
long beginTime = System.currentTimeMillis();
/*模拟服务:休息一段时间:
* 在这里我们都定义成了int类型的了*/
int maxRand = constants.MAX_SERVERS_TIME - constants.MIN_SERVER_TIME;
long serverTime = new Random().nextInt(maxRand) + 1 + constants.MIN_SERVER_TIME;
try
{
Thread.sleep(serverTime); /*让它休息1 - 10 秒钟*/
} catch (InterruptedException e)
{
e.printStackTrace();
}
long costTime = System.currentTimeMillis() - beginTime;
System.out.println(WindowName + "为第" + number + "个" + type + "客户完成服务," + "耗时" + costTime/1000 + "秒");
}
else
{
System.out.println(WindowName + "没有获取到快速任务");
commonServers(); //需要改动
try
{
Thread.sleep(1000); /*让它休息1秒钟*/
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
package com.itcast.band;
public enum CustomerTypes
{
COMMON,EXPRESS,VIP;
/*接下来我们来获取枚举里边的元素所对应的自定义元素*/
public String toStirng()
{
String name = null;
switch(this) // 是当前对象的话
{
case COMMON:
name = "普通";
break;
case EXPRESS:
name = "快速";
case VIP:
name = name(); //我们直接返回的就是该枚举对象
}
return name;
}
}
|