08 交通灯管理系统

笔者观看了张老师关于交通灯管理系统的视频讲解,按照要求自己重新编写了程序。

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. 模块分析

整个程序涉及到一个接口(常数标签)和五个类(main类,信号灯类,车流类,放行类和监视器类)。

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;
}

3.2 信号灯类

<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值