------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
1. 枚举类的特点;
枚举类不能在外面单独创建对象;
2. 对于系统中灯的设计,使用了枚举类;
设计情况;
每个枚举元素各表示一个方向的控制灯,每一个枚举类都是一个实例对象;
注明;4个灯依次亮;
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);
创建一个构造函数,必须是私有的;参数的意义;opposite对应的灯;next下一个灯;lighted是否是绿色的;
private Lamp(String opposite,String next,boolean lighted){
this.opposite = opposite;
this.next = next;
this.lighted = lighted;
}
3. 枚举类里面实现了两个方法;
其中Lamp.valueOf(opposite).light();返回的是一个Lamp灯的对象;就是一个枚举类的对象;下面是这两个方法的具体实现;
某个灯变绿时,它对应方向的灯也要变绿,灯变绿的方法;
public void light(){
this.lighted = true;
if(opposite != null){
将字符串变成对象;Lamp.valueOf(opposite)返回的是灯的对象;
Lamp.valueOf(opposite).light();
}
System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");
System.out.println(name() + " lamp is green,四个不受控制的一直是亮的,两个受控制的;");
}
灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿
@return 返回下一个要变绿的灯
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;
}
4. 对于灯的变化时间,我们是通过线程实现的;代码如下;
/*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿
*参数nThreads代表 -池中的线程数
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
command - 要执行的任务
initialDelay - 首次执行的延迟时间
period - 连续执行之间的周期
unit - initialDelay 和 period 参数的时间单位
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
System.out.println("来啊");
// 返回下一个变亮的灯;
currentLamp = currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
5. 在路上不断的添加车辆;
//模拟车辆不断随机上路的过程
Executors这个是一个java线程并发库工具类。里面有大量的静态方法;是一个执行器类;
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable(){
public void run(){
for(int i=1;i<1000;i++){
try {
Thread.sleep((new Random().nextInt(10) + 1) * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//访问外部类中的成员变量;
vechicles.add(Road.this.name + "_" + i);
}
}
});
6. 再用一个定时线程判断我们这个灯是不是亮着的;
//每隔一秒检查对应的灯是否为绿,是则放行一辆车
newScheduledThreadPool是定时器;
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
if(vechicles.size()>0){
boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
if(lighted){
//我们取出的车,就是走过路的车;
System.out.println(vechicles.remove(0) + " is traversing !");
}
}
}
},
1,
1,
TimeUnit.SECONDS);
7. 对于交通灯管理系统的总结;
1、用到了枚举类;
2、用到了定时线程和不定时线程
3、用到了集合;
4、Executors这个是一个java线程并发库工具类。里面有大量的静态方法;是一个执行器类;