模拟实现十字路口的交通灯管理系统逻辑,具体要求如下:
异步随机生成按照各个路线行驶的车辆.
例如:由南向而来去往北向的车辆----直行车辆
由西向而来去往南向的车辆----右转车辆
由东向而来去往南向的车辆----左转车辆
…………….
信号灯忽略黄灯,只考虑红灯和绿灯.
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制.
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同.不考虑特殊情况下的控制逻辑.
注: 南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆后放行左转车辆.
每辆车通过路口时间为1秒(提示: 可通过线程Sleep 的方式模拟).
随机生成车辆时间间隔以及红绿灯交换时时间间隔自定,可以设置.
不要求实现Gull,只考虑系统逻辑实现,可通过log 方式展现程序运行结果.
交通灯系统的项目:
在项目开发中,其实是以不变应万变。例如,有人在黑板上画圆。就是以黑板这个不变的事物,来作为基准。然后在黑板上选取一个点的横坐标与纵坐标来画圆。而对于小球在绳子上移动问题来说,绳子就是不变的东西,而以绳子上的基准点来表示小球的移动。在用两块石头磨成刀,刀来砍树,树砍成木材,木材做成椅子。因此以刀加工厂来调用生成刀的方法。中间使用石头。而木材为石刀有砍树这个功能。椅子加工厂则能运用材料来制作椅子。
在交通灯这个项目中,不变的只有路。一个十字路口,每条路都向除自己之外的三条路行驶。因此,有十二条路可以走。每条路与其相反方向的灯应该一样。向右拐弯应该是永远绿灯的。而向左拐则应在直走之后。路灯只考虑红绿二色。
在路,灯,以及灯控制器三者来说,路上可以行使车辆,因此会产生一个生成车的方法。路灯则是显示走向。路灯控制器则是用来真正控制路面车辆行驶的。另外,有一个main()程序,用来调用路,灯,已经灯控制器三者的类以及方法。
对题目分析如右图:![](https://img-blog.csdn.net/20140111230247562?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQzMjI4MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
确定需要创建的对象:
12条路线也就对应12条线路对象,在每条路线上,车源源不断的不定时开来.如果当前路线的灯为绿灯,则车每秒开走一辆.
12条线路就对应12个灯对象,当一个路线的灯为绿灯时,它相反方向的灯也变绿灯(直行与直行,左转与左转),这种依次变绿的过程,是按一定顺序的,所以可以用一个枚举来定义,这12个灯,每个灯对应三个参数,它的相反方向的灯,它的下一个灯,以及它的红绿状态.
这12个灯,需要一个控制器,控制将灯变绿,隔多长时间再将它变红,右转的四个灯是常绿状态,不需要控制,剩余的八个灯,只需要控制四个灯: S2N,S2W,W2E,W2N即可,它的相反方向的灯的红绿状态在同一时间和它们的红绿状态一样.
最后需要创建一个调度类,创建控制器对象,让控制器开始控制交通灯的红绿交换,并启动上面的12条路对象,让上面的车根据控制器所控制的当前路线灯的红绿状态."走走停停".
代码实现:
package test.traffic;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Road {
private String name = null;
List<String> vehicle = new ArrayList<String>();
public Road(String name) {
this.name = name;
ExecutorService pool = Executors.newFixedThreadPool(1);
pool.execute(new Runnable() {
int i = 1;
@Override
public void run() {
while (i < 1000) {
vehicle.add(Road.this.name + "路线上的第" + (i++) + "辆车");
try {
Thread.sleep((new Random().nextInt(10) + 1) * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// TODO Auto-generated method stub
}
}
});
pool.isShutdown();
ScheduledExecutorService timer = Executors
.newSingleThreadScheduledExecutor();
timer.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
boolean blue = Lamp.valueOf(Road.this.name).blue;
if (vehicle.size() != 0) {
while (blue) {
System.out.println(vehicle.remove(0) + "正在通过十字路口!");
/*
* remove( 0 ) : 移除此列表中指定位置上的索引为0的元素 , 同时向左移动所有后续元素 (
* 将其索引减 1 ) 即移动第0个元素后 , 原第一个元素的索引就变成了0 。
*/
}
// TODO Auto-generated method stub
}
}
}, 1, 2, TimeUnit.SECONDS);
}
}
Lamp (灯) 代码
package test.traffic;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class LampController {
private Lamp currentLamp = Lamp.S2N;
public LampController() {
System.out.println("最多有6个方向的车可以通过");
currentLamp.blueLight();
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
currentLamp = currentLamp.redLight();
}
}, 10, 15, TimeUnit.SECONDS);
}
}
LampController(灯控制器) 代码:
package test.traffic;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class LampController {
private Lamp currentLamp = Lamp.S2N;
public LampController() {
System.out.println("最多有6个方向的车可以通过");
currentLamp.blueLight();
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
currentLamp = currentLamp.redLight();
}
}, 10, 15, TimeUnit.SECONDS);
}
}
启动代码:
package test.traffic;
public class Scheduler {
public static void main(String[] args) {
/* 产生12个方向的路线 */
String[] directions = new String[] { "S2N", "S2W", "E2W", "E2S", "N2S",
"N2E", "W2E", "W2N", "S2E", "E2N", "N2W", "W2S" };
for (int i = 0; i < directions.length; i++) {
new Road(directions[i]);
}
/* 产生整个交通灯系统 */
new LampController();
}
// TODO Auto-generated method stub
}