---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
1.分析模型
总共有12条路线,为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的4条路线的控制灯可以假设称为常绿状态,另外,其他的8条线路是两两成对的,可以归为4组,所以,程序只需考虑图中标注了数字号的4条路线的控制灯的切换顺序,这4条路线相反方向的路线的控制灯跟随这4条路线切换,不必额外考虑。
2.设计类
·Road类
1.Executors.newSingleThreadExecutor()创建一个线程,其中run()方法内部代码的功能是随机产
生车辆;
ExecutorService pool=Executors.newSingleThreadExecutor();
pool.execute(new Runnable(){
public void run(){
for(inti=1;i<1000;i++){
try {
Thread.sleep((new Random().nextInt(10)+1)*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//将产生的车辆添加到集合中
vehicles.add(Road.this.name+"的第"+i+"辆车");
}
}
});
2.用Executors.newScheduledThreadPool(1)创建一个线程,其中run()方法内部的代码功能是检查对应道路的灯是否为绿灯,是,则将集合中的元素删除;即放行车辆。
//每隔固定的时间检查对应的灯是否为绿灯,是,则放行一辆车
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
if(vehicles.size()>0){
boolean lighted=Lamp.valueOf(Road.this.name).isLighted();
if(lighted){
System.out.println(vehicles.remove(0)+" is traversing !!!");
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
·Lamp类
Lamp类是一个枚举类,该类首先要定义每条道路上的灯,共十二个;其中该类中的方法应该有:
1.判断灯是否是绿灯
public boolean isLighted(){
return lighted;
}
2.将绿灯变成红灯的方法(注意此时应该让下一个变成绿灯)
public void light(){
this.lighted=true;
if(opposite!= null){
Lamp.valueOf(opposite).light();
}
}
3.让灯变成绿灯的方法(要注意的是该等变成绿灯后对应的方向的灯也要变成绿灯)
public Lamp blackOut(){
this.lighted=false;
if(opposite!=null){
Lamp.valueOf(opposite).blackOut();
}
LampnextLamp=null;
if(next!=null){
nextLamp=Lamp.valueOf(next);
System.out.println("green light from"+name()+"---to---"+next);
nextLamp.light();
}
return nextLamp;
}
·LampController类
用Executors.newScheduledThreadPool(1)定义一个定时器,其中run()方法内代码的功能是
隔一段时间让那个当前的等改变颜色并且使下一个方向的灯变成相反的颜色
public class LampController {
private Lamp currentLamp;
public LampController(){
//任意选择一个方向的灯变成绿灯
currentLamp=Lamp.S2N;
currentLamp.light();
//每隔一定时间让当前绿灯变红,并且下一个方向的灯变绿
ScheduledExecutorServicetimer=Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run() {
currentLamp=currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
·MainClass类
创建十二个信号灯的对象;创建LampController对象即可。
String[] deStrings=new String[]{
"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
for(int i=0;i<deStrings.length;i++){
new Road(deStrings[i]);
}
new LampController();
}
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------