---------------------- android培训、java培训、期待与您交流! ----------------------
巧妙的地方:1,把整个系统的逻辑路线抽取到只有4条;
2,Road和Lamp通过String联系起来;
3,把车流用集合描述
在这个教程中还学到了一些新知识,Executors的用法,线程池(ExecutorService)和定时器(ScheduledExecutorService)的概念及用法。
//定义线程池及用法
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable() {
@Override
public void run() {
for (int i = 1; i < 1000; i++) {
try {
// Thread.sleep((long) (Math.random()*10));
Thread.sleep((new Random().nextInt(10) + 1) * 1000);
transportation.add(Road.this.name + "--" + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
//定义定时器及其用法
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
if (transportation.size() > 0) {
boolean lighted = Lamp.valueOf(Road.this.name).isGreen();
if (lighted) {
System.out.println(transportation.remove(0)
+ " is traversing !");
}
}
}
}, 1, 1, TimeUnit.SECONDS);
}
在写Lamp的类时,自己做了一些修改,用了switch语句表示相反的和下一个灯,如下:
public enum Lamp {
S2N,S2W,E2W,E2S,
N2S,N2E,W2E,W2N,
S2E(true),E2N(true),N2W(true),W2S(true);
private boolean isGreen;
private Lamp(boolean isGreen){
this.isGreen = isGreen;
}
private Lamp(){
}
private Lamp next(){
switch(this){
case S2N:
return S2W;
case S2W:
return E2W;
case E2W:
return E2S;
case E2S:
return S2N;
}
return null;
}
private Lamp opposite(){
switch(this){
case S2N:
return N2S;
case S2W:
return N2E;
case E2W:
return W2E;
case E2S:
return W2N;
}
return null;
}
public boolean isGreen(){
return isGreen;
}
public void toGreen(){
isGreen = true;
if (this.opposite()!=null)
this.opposite().isGreen = true;
System.out.println(name() + " & "+ opposite().name() + " turn green oooo!");
}
public Lamp toRed(){
System.out.println(name() + " & "+ opposite().name() + " turn red XXXX!");
isGreen = false;
if (this.opposite()!=null)
this.opposite().isGreen =false;
if(next()!=null)
next().toGreen();
return next();
}
}
最终效果上和教程里是一样的。
以上。