模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
。。。
信号灯忽略黄灯,只考虑红灯和绿灯。
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
分析图
车辆类。
public class Car {
String name;
String start;
String fangxiang;
public String getStart() {
return start;
}
public void setStart(String start) {
this.start = start;
}
public String getFangxiang() {
return fangxiang;
}
public void setFangxiang(String fangxiang) {
this.fangxiang = fangxiang;
}
public String getName() {
return this.start + "_TO_" + this.fangxiang;
}
}
交通灯类。
public class Lamp {
String[] names = { "NS_LINE", "NS_LEFT", "WE_LINE", "WE_LEFT" };
String name;
public String NextLamp(String name) {
switch (name) {
case "NS_LINE":
return "NS_LEFT";
case "NS_LEFT":
return "WE_LINE";
case "WE_LINE":
return "WE_LEFT";
case "WE_LEFT":
return "NS_LINE";
}
return null;
}
}
道路类。
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class The_road {
String[] starts = { "E", "W", "S", "N" };
String[] fangxiangs = { "LINE", "LEFT", "RIGHT" };
Lamp lampManager = new Lamp();
String lamp = "WE_LINE";
List<Car> EW_LINE_listcar = new ArrayList<Car>();
List<Car> EW_LEFT_listcar = new ArrayList<Car>();
List<Car> SN_LINE_listcar = new ArrayList<Car>();
List<Car> SN_LEFT_listcar = new ArrayList<Car>();
List<Car> RIGHT_listcar = new ArrayList<Car>();
// 东西公路。
public void The_run_road() {
ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
pool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
if ("WE_LINE".equals(The_road.this.lamp)
&& (EW_LINE_listcar.size() != 0)) {
System.out.println(EW_LINE_listcar.get(0).getName()
+ "____通过十字路口");
EW_LINE_listcar.remove(0);
}
if ("WE_LEFT".equals(The_road.this.lamp)
&& (EW_LEFT_listcar.size() != 0)) {
System.out.println(EW_LEFT_listcar.get(0).getName()
+ "____通过十字路口");
EW_LEFT_listcar.remove(0);
}
if ("NS_LINE".equals(The_road.this.lamp)
&& (SN_LINE_listcar.size() != 0)) {
System.out.println(SN_LINE_listcar.get(0).getName()
+ "____通过十字路口");
SN_LINE_listcar.remove(0);
}
if ("NS_LEFT".equals(The_road.this.lamp)
&& (SN_LEFT_listcar.size() != 0)) {
System.out.println(SN_LEFT_listcar.get(0).getName()
+ "____通过十字路口");
SN_LEFT_listcar.remove(0);
}
if (RIGHT_listcar.size() != 0) {
System.out.println(RIGHT_listcar.get(0).getName()
+ "____通过十字路口");
RIGHT_listcar.remove(0);
}
//
}
}, 1, 1, TimeUnit.SECONDS);
}
// 南北公路。
public void The_lamp() {
ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
pool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
lamp = lampManager.NextLamp(lamp);
if("NS_LINE".equals(lamp)){
System.out.println("**************************************************************");
System.out.println("南北直行 左转《红》 直行《绿》 辆可以右转 ");
System.out.println("**************************************************************");
}
if("NS_LEFT".equals(lamp)){
System.out.println("**************************************************************");
System.out.println("南北左转 左转《绿》 直行《红》 辆可以右转 ");
System.out.println("**************************************************************");}
if("WE_LINE".equals(lamp)){
System.out.println("**************************************************************");
System.out.println("东西直行 左转《红》 直行《绿》 辆可以右转 ");
System.out.println("**************************************************************");}
if("WE_LEFT".equals(lamp)){
System.out.println("**************************************************************");
System.out.println("东西左转 左转《绿》 直行《红》 辆可以右转 ");
System.out.println("**************************************************************");}
}
}, 0, 10, TimeUnit.SECONDS);
}
int num = 0;
// 自动产生车辆
public void On_the_road() {
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
while (num < 50) {
Car car = new Car();
car.setStart(starts[new Random().nextInt(4)]);
car.setFangxiang(fangxiangs[new Random().nextInt(3)]);
// System.out.println(car.getName());;
// 东西路段直走,左转车辆判断。
if (("E".equals(car.getStart()) || "W".equals(car
.getStart())) && "LINE".equals(car.getFangxiang())) {
EW_LINE_listcar.add(car);
}
if (("E".equals(car.getStart()) || "W".equals(car
.getStart())) && "LEFT".equals(car.getFangxiang())) {
EW_LEFT_listcar.add(car);
}
// 南北路段直走,左转车辆判断。
if (("S".equals(car.getStart()) || "N".equals(car
.getStart())) && "LINE".equals(car.getFangxiang())) {
SN_LINE_listcar.add(car);
}
if (("S".equals(car.getStart()) || "N".equals(car
.getStart())) && "LEFT".equals(car.getFangxiang())) {
SN_LEFT_listcar.add(car);
}
// 右转的车辆。
if ("RIGHT".equals(car.getFangxiang())) {
RIGHT_listcar.add(car);
}
// System.out.println("EW_LINE_listcar:"
// + EW_LINE_listcar.toString());
// System.out.println("EW_LEFT_listcar:"
// + EW_LEFT_listcar.toString());
// System.out.println("SN_LINE_listcar:"
// + SN_LINE_listcar.toString());
// System.out.println("SN_LEFT_listcar:"
// + SN_LEFT_listcar.toString());
// System.out.println("RIGHT_listcar:"
// + RIGHT_listcar.toString());
// System.out.println();
// System.out.println();
// System.out.println();
num++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
}
运行主函数。
public class MainClass {
public static void main(String[] args) {
The_road road = new The_road();
road.On_the_road();
road.The_lamp();
road.The_run_road();
}
}
运行结果: