在张老师讲解的基础上做了一些改动,供大家参考,欢迎批评指正:
1. 为车辆单独写一个类:Vehicle。
张老师的视频中,车辆只是一个字符串,因此没有专门建一个类。我考虑到车辆编号、行驶方向应该是车辆本身的属性,且为今后做其他扩展方便,故将车辆封装为对象。
2. 简化交通灯类:TrafficLamp
张老师的视频中,为每个方向都设置了一盏灯。我觉得可以简化,尤其是右转灯仅仅为统一程序逻辑而设计出来,每个路口都放一盏没有必要。从南往北路线的灯变绿(红)时,从北往南路线的灯也是绿(红)的,故可以合并为一盏。同理,从南往西和从北往东的两盏左转灯也可以合并为一盏。最终只需要5盏灯:南北直行灯、南北左转灯、东西直行灯、东西左转灯、右转灯。枚举定义如下:
- public enum TrafficLamp {
- // 南北直行灯、南北左转灯、东西直行灯、东西左转灯、右转灯
- SNSTRAIGHT(false, "SNLEFT"), SNLEFT(false, "EWSTRAIGHT"),
- EWSTRAIGHT(false, "EWLEFT"), EWLEFT(false, "SNSTRAIGHT"),
- RIGHT(true, null);
-
- private volatile boolean passable; // 当前灯是否可通行
- private String next; // 下一盏灯. 由于初始化顺序,无法直接获取未初始化的TrafficLamp对象,因而暂时用string
-
- private TrafficLamp(boolean passable, String next) {
- this.passable = passable;
- this.next = next;
- }
-
- public boolean isPassable() {
- return passable;
- }
-
- /**
- * 切换为绿灯
- */
- public void setPassable() {
- this.passable = true;
- System.out.println(this + " turn green");
- }
- /**
- * 切换为红灯,同时下一盏灯切换为绿灯
- */
- public TrafficLamp setImpassable() {
- if (this == TrafficLamp.RIGHT) // 右转灯永不切换
- return this;
- this.passable = false;
- System.out.println(this + " turn red");
- TrafficLamp nextLamp = TrafficLamp.valueOf(this.next);
- nextLamp.setPassable();
- return nextLamp;
- }
- }
复制代码
3. 通行线路仍为12条,但作为程序执行入口的TrafficSimulation类的main方法中,只创建启动东西南北4个路口线程,每个路口的直行、左转、右转通行线程由路口类Road负责创建和启动。Road类负责路口车辆生成和车辆通行任务。为每一个车辆通行方向设置一个车辆队列,数据结构为BlockingQueue
- /** 直行车队列 */
- private BlockingQueue<Vehicle> straightVehicles = new LinkedBlockingQueue<Vehicle>();
- /** 左行车队列 */
- private BlockingQueue<Vehicle> leftVehicles = new LinkedBlockingQueue<Vehicle>();
- /** 右行车队列 */
- private BlockingQueue<Vehicle> rightVehicles = new LinkedBlockingQueue<Vehicle>();
复制代码
由于每个路口有三个通行方向,因此生成车辆时要随机产生行驶方向,这可以用随机数来完成。生成0、1、2三个随机数,分别代表左转、右转、直行三个方向。
- // 随机生成车辆行驶方向,并放入相应车辆队列
- int direction = rand.nextInt(3);
- switch (direction) {
- case 0:
- leftVehicles.put(new Vehicle(Direction.valueOf("LEFT")));
- break;
- case 1:
- rightVehicles.put(new Vehicle(Direction.valueOf("RIGHT")));
- break;
- case 2:
- straightVehicles.put(new Vehicle(Direction.valueOf("STRAIGHT")));
- break;
- }
复制代码
全部代码在附件中,可直接在eclipse中导入工程。
P.S. 我的eclipse的文件编码是UTF-8 如果中文注释出现乱码,可参考此信息
7k_交通灯.zip
(14.97 KB, 下载次数: 552)
|