交通灯管理
1:分析
* 十字路口有十二个方向
* 我们只要考虑四个方向的实现(有四个是一直可以走的(右拐的),还有四个和考虑的四个完全一样的情况)
* 灯只有十二,所以拿做是枚举类型来考虑
* 灯有对应面的灯,下是灯,灯是否亮这样的情况,当作属性
* 有路。也是十二条,路创建的时候就开始工作,它可以随机的增加车辆,它还有每过一秒钟看一下它所
对应的灯是否绿了,绿了就开过去。
* 灯的管理类, 管理把当前灯变红变绿,把一个灯变红变绿,重复的执行着。
* 灯在亮和黑的时候对面的灯也做同一样的操作,为了不死循环有一个灯做主灯。就是说从灯的对应的灯是空的。
2:交通灯的实现
* 主要对灯的构造认真做到。 对下一个灯,对面的灯。较好的把握,不要把自己弄迷了。
public enum Lamp {
//十二个方向的灯,每个个下一个方向的灯就好像实际当中那样。每个对面的灯就好像成180度一样。
//这样轮回着测试,每个灯开始的时候是暗的。只有四个右拐的灯因为永远是亮的,所以开始就设置成亮的。
S2N("S2W","N2S",false),S2W("E2W","N2E",false),E2W("E2S","W2E",false),E2S("S2N","W2N",false),
N2S("N2E",null,false),N2E("W2E",null,false),W2E("W2N",null,false),W2N("N2S",null,false),
S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);
//枚举的构造方法私有。
private Lamp(String next,String oppsite,boolean lighted) {
this.next = next;
this.oppsite = oppsite;
this.lighted = lighted;
}
//灯是否是绿色的
private boolean lighted;
//对应方向的灯
private String oppsite;
//下一个灯
private String next;
//判断灯是否是亮的,车在过路的时候要看一下灯是否是绿的,是的话就走过去。
public boolean islighted() {
return lighted;
}
//变绿,每隔一段时间我们都要把一个灯变亮,同时把对面的灯也变亮
public void ligth() {
this.lighted = true;
if(this.oppsite != null ) {
Lamp.valueOf(this.oppsite).lighted = true;
}
}
//变红,每隔一段时间我们都要把一个灯变黑,把一个个也变黑,同时返回下一个灯,并把下一个灯点亮。
public Lamp black() {
this.lighted = false;
if(this.oppsite != null) {
Lamp.valueOf(this.oppsite).black();
}
Lamp next = null;
if(this.next != null) {
next = Lamp.valueOf(this.next);
next.ligth();
}
return next;
}
}
3:路的实现:
public class Road {
/*每条路都有自己的的名字*/
private String name;
/*每条路上的汽车*/
private List<String> vehicles = new ArrayList<String>();
public Road(String name) {
this.name = name;
//创建一个线程用它来不停地增加路上的车
ExecutorService es = Executors.newSingleThreadExecutor();
es.execute(new Runnable() {
@Override
public void run() {
int i = 0;
while(true) {
System.out.println(Road.this.name + " 路上开了一车过来了");
vehicles.add(Road.this.name + "_" + i++);
try {
Thread.sleep(new Random().nextInt(10)*1000);
}catch(Exception e) {
e.printStackTrace();
}
}
}
});
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
if(vehicles.size()>0) {
boolean lighted = Lamp.valueOf(Road.this.name).islighted();
if(lighted) {
System.out.println(vehicles.remove(0) + "路上一车开过去了");
}
}
}
}, 1, 1, TimeUnit.SECONDS);
}
}
4:控制器的实现:
public class LampControl {
//控制器一直保留着当前的灯,以便灵活的工作
private Lamp currentLamp;
public LampControl() {
currentLamp = Lamp.S2N; //开始的时候是这个灯变绿
currentLamp.ligth();
//执行每隔10秒就使得当前灯变红,下一个灯变绿的操作,并且把下一个灯赋值给currentLamp
ScheduledExecutorService se = Executors.newScheduledThreadPool(1);
se.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println(currentLamp.name() + "灯变绿了");
currentLamp = currentLamp.black();
}
}, 10, 10, TimeUnit.SECONDS);
}
}
5:开始测试
public static void main(String[] args) {
String[] cars = new String[]{"S2N","S2W","E2W","E2S",
"N2S","N2E","W2E","W2N",
"S2E","E2N","N2W","W2S"};
for(int i=0; i<cars.length; i++) {
Road road = new Road(cars[i]);
}
new LampControl();
}