黑马程序员-交通灯管理系统

来源:互联网 发布:农副产品交易网软件 编辑:程序博客网 时间:2024/06/04 19:23

---------------------android培训、java培训、期待与您交流! -------------------------

产品需求:

  1. 异步随机生成按照各个路线行驶的车辆。例如:
    由南向而来去往北向的车辆 ---- 直行车辆
    由西向而来去往南向的车辆 ---- 右转车辆
    由东向而来去往南向的车辆 ---- 左转车辆
  2. 信号灯忽略黄灯,只考虑红灯和绿灯。
  3. 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
  4. 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
    注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
  5. 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
  6. 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
  7. 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

系统常量:

package com.uc.traffic;//随机生成车辆时间间隔以及红绿灯交换时间间隔自定public final class Constants {/** * 交通灯时间切换常数,单位 s */public static final int LAMPINTERVAL = 10;/** * 生成车辆时间间隔 */public static final int PRODUCEINTERVAL = 10;}

交通灯功能模拟:

package com.uc.traffic;public enum Lamp {S2N("S2W", false, "N2S"), S2W("E2W", false, "N2E"), E2W("E2S", false, "W2E"), E2S("S2N", false, "W2N"),N2S(null, false, null), N2E(null, false, null), W2E(null, false, null), W2N(null, false, null),S2E(null, true, null), E2N(null, true, null), N2W(null, true, null), W2S(null, true, null);private Lamp(String next, boolean light, String opposite) {this.next = next;this.light = light;this.opposite = opposite;}public boolean isLight() {return this.light;}public void light() {this.light = true;if (null != this.opposite) {Enum.valueOf(Lamp.class, this.opposite).light();}System.out.println("The lighted lamp is " + this.name());}public Lamp blackOut() {this.light = false;if (null != this.opposite) {Enum.valueOf(Lamp.class, this.opposite).blackOut();}System.out.println("The black lamp is " + this.name());Lamp lamp = null;if (this.next != null) {lamp = Enum.valueOf(Lamp.class, this.next);lamp.light();}return lamp;}private String opposite;private String next;private volatile boolean light;}

交通灯切换控制

package com.uc.traffic;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;/* * 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。 */public class LampController {public LampController() {currentLamp = Lamp.S2N;currentLamp.light();ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {currentLamp = currentLamp.blackOut();}}, 0,  Constants.LAMPINTERVAL, TimeUnit.SECONDS);}private Lamp currentLamp;}

异步生成车辆,控制车辆通行

package com.uc.traffic;import java.util.List;import java.util.Random;import java.util.Vector;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class Road {private static final int COUNT = 100;private static final Random generator = new Random();public Road(String name) {this.name = name;ExecutorService service = Executors.newSingleThreadExecutor();//随机添加车辆service.execute(new Runnable() {@Overridepublic void run() {for (int i = 1; i < COUNT; i++) {try {Thread.sleep(generator.nextInt(Constants.PRODUCEINTERVAL) * 1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}vechicles.add(Road.this.name + "-" + i);}}});//每秒通过一辆车ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubboolean light = Enum.valueOf(Lamp.class, Road.this.name).isLight();if (light) {if (vechicles.size() > 0) {System.out.println(vechicles.remove(0) + " is travalling");}}}}, 0, 1, TimeUnit.SECONDS);}//两个线程同时对集合容器进行操作, 要考虑同步private List<string> vechicles = new Vector<string>();private String name;}</string></string>

主控制类

public class MainClass {/** * @param args */public static void main(String[] args) {String[] roads = {"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};for (int i = 0; i < roads.length; i++) {new Road(roads[i]);}new LampController();}}

---------------------android培训、java培训、期待与您交流! -------------------------

0 0