//指定各个窗口运行的条件。
public static void main(String[] args) {
//ServiceWindow window = null;
for(int i=1;i<5;i++){
//产生4个普通窗口分别为1234号
//ServiceWindow commonWindow = new ServiceWindow();
ServiceWindow commonWindow = new ServiceWindow();
commonWindow.setWindowID(i);
commonWindow.start();
}
ServiceWindow expressWindow = new ServiceWindow();
expressWindow.setType(CustomerType.EXPRESS);//直接设置为快速窗口
expressWindow.start();
ServiceWindow vipWindow = new ServiceWindow();
vipWindow.setType(CustomerType.VIP);//vip窗口
vipWindow.start();
//号码产生在4个参数条件下运行。。定时产生:。。使用
Executors.newScheduledThreadPool(1).scheduleAtFixedRate方法
//
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer number = NumberMachine.getInstance
().getCommonManager().generateNewManager();
System.out.println(number+"号普通客户等待服
务!");
}
},
0, //作用时间
Constants.COMMON_CUSTOMER_INTERVAL_TIME, //每隔多长时间产生一个
TimeUnit.SECONDS); //时间单位
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer number =
NumberMachine.getInstance().getExpressManager().generateNewManager();
System.out.println(number+"号快
速客户等待服务!");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME*2,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer number = NumberMachine.getInstance
().getVipManager().generateNewManager();
System.out.println(number+"号vip客户等待服
务!");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,
TimeUnit.SECONDS);
}
Constants类
定义三个常量:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME
NumberManager类
定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合。
定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据
,所以,要进行同步。
NumberMachine类
定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个
对应的方法来返回这三个NumberManager对象。
将NumberMachine类设计成单例。
CustomerType枚举类
系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。
重写toString方法,返回类型的中文名称。这是在后面编码时重构出来的,刚开始不用考虑。
ServiceWindow类
定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法。
定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信息。
public enum Lamp {
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),
S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);
//将汽车过指示灯可以分成12个方向。
private Lamp(String opposite,String next, boolean lighted)
//可以这样直接指示三个方法。。 本灯 ,下个灯,本灯亮。
{
this.opposite=opposite;
this.next = next;
this.lighted=lighted;
}
private boolean lighted;
private String opposite;
private String next;
//
public void light(){
this.lighted=true;
if(opposite!=null){
Lamp.valueOf(opposite).light();
}
System.out.println(name()+"lamp is green , 下面总共应该有6个方法能看到汽车在走");
}
public boolean isLighted(){
return lighted;
}
public Lamp blackOut(){
this.lighted=false;
if(opposite!=null){
Lamp.valueOf(opposite).blackOut();
}
Lamp nextLamp = null;
if(next!=null){
nextLamp= Lamp.valueOf(next);
System.out.println("绿灯从"+name()+"----->切换为"+next);
nextLamp.light();
}
return nextLamp;
}
}
//方法Executors.newSingleThreadExecutor():产生一个线程池。execute(null)然后用其中的...线程
Executors.newSingleThreadExecutor().execute(new Runnable(){
public void run(){
while(true){//switch比 if else效率高, switch只能使用int类型。
//创建灯的控制器。
public class LampController {
private Lamp currentLamp;//私有,保证安全。
public LampController(){
currentLamp = Lamp.S2N;
currentLamp.light();
//控制器的方法。记住。。。。可以有三个参数四个参数的方法。
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
currentLamp = currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
timer.scheduleAtFixedRate(command, initialDelay, period, unit)
指定的程序在多少延迟后进入多长时间的重复固定速率运行
private List queueNumber = new ArrayList();//变量接口类型尽量用父类。类似那个类加载器
。
类加载器从目标出发往父类寻找方法没有再在子类一级级找。