笔者观看了张老师关于交通灯管理系统的视频讲解,按照要求自己重新编写了程序。
1. 项目需求
(1)异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
。。。
(2)信号灯忽略黄灯,只考虑红灯和绿灯;
(3)应考虑左转车辆控制信号灯,右转车辆不受信号灯控制;
(4)具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆;
(5)每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟);
(6)随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置;
(7)不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
2. 需求分析
(1)点:异步生成要求我们使用多线程,每条车流都要有自己的线程。车辆生成间隔可以用Thread.sleep(new Random()...)来模拟;
(2)点:不考虑黄灯,说明信号灯总体上只有两个状态:放行和不放行;
(3)点:右转车辆不受信号灯控制,因而右转车辆的控制可以省略,实际上只需考虑8条车流;
(4)点:这个要求规定了信号灯的有限状态机。按照日常生活经验,左转灯要单独列出。这样每个方向上的灯都需显示三种信号:直行,左转,停车。状态机采取南北直行,全向左转,东西直行的循环,以保证任一条道路上没有对向驶来的车流;因为信号灯需要定时转换信号,所以需要单列一个信号灯线程,使用线程休眠方式来定时;
(5)点:车辆驶出道路需要1秒,需要创建放行线程定时放行车辆并刷新车辆数;
(6) 点:时间间隔通过相应线程的休眠时间来控制;
(7)点:为了打印Log,需要单列一个监视器线程,监视8条车流的情况。无论是新车出现还是旧车放行导致剩余车辆数有变化,都需要打印变化情况。
综上,这个项目的难点是同时运行的线程较多,而且不同线程的打印语句有可能互相干扰,导致LOG上输出的语句顺序混乱。张老师用到了java.util.concurrent包中的并发线程工具。这些工具相比于Thread类中的方法,更为简洁和安全。不过笔者还是想用自学视频中讲到的多线程基本语句来写。这样做在代码上更繁琐一些,但是却更熟悉。
3. 模块分析
3.1 接口
import java.util.*;
//用常数代替字符串作为标签
interface Tag
{
//直行信号
public final int PASS = -1;
//左转信号
public final int LEFT_PASS = -2;
//停车信号
public final int STOP = -3;
//信号间隔(秒)
public final long LAMP_PERIOD = 3;
//任一道路上的车辆出现间隔(最小值,秒)
public final double CAR_PERIOD_MIN = 2;
//最大值(秒)
public final double CAR_PERIOD_MAX = 3;
}