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

来源:互联网 发布:经典爱情电影 知乎 编辑:程序博客网 时间:2024/06/06 09:13

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


刚刚看完了张孝祥老师讲的《交通灯管理系统》,实在的说,看的非常晕,只是跟着敲了一遍代码,跟着视频做了些笔记,本以为三个小时就能看完,结果居然看了7个多小时。

 

交通灯管理系统的项目需求


模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:

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


画图非常有助于理解和分析问题,你还有比画图更好的办法吗?


 


总共有12条路线,为了统一编程模型,可以假设每条路线都有一个红路灯对其进行控制。左转弯的4条路线的控制控制可以假设为常绿状态,另外其他的8条路线是两两成对的,可以归为四组,所以程序只需考虑途中标注了数字标号的四条路线的控制灯的切换顺序,这四条路线相反方向的路线的控制灯跟随这四条路线的切换,不必额外考虑。


下面是跟着张孝祥老师视频写的代码:

MainClass.java

package com.isoftstone.interview.traffic;public class MainClass {public static void main(String[] args) {String [] directions = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};for(int i=0;i<directions.length;i++){new Road(directions[i]);}new LampControler();}}

Road.java

package com.isoftstone.interview.traffic;import java.util.List;import java.util.ArrayList;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class Road {private List<String> vehicles = new ArrayList<String>();private String name = null;public Road(String name) {super();this.name = name;ExecutorService pool = Executors.newSingleThreadExecutor();pool.execute(new Runnable() {@Overridepublic void run() {for (int i = 1; i < 1000; i++) {try {Thread.sleep((new Random().nextInt(10) + 1) * 1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}vehicles.add(Road.this.name + "_" + i);}}});ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {if (vehicles.size() > 0) {boolean lighted = Lamp.valueOf(Road.this.name).islighted();if (lighted) {System.out.println(vehicles.remove(0)+ " is tranversing ");}}}}, 1, 1, TimeUnit.SECONDS);}}
Lamp.java
package com.isoftstone.interview.traffic;public enum Lamp {S2N("N2S", "S2W", false), S2W("N2E", "E2W", false), E2W("W2E", "E2S", false), E2S("W2N", "S2N", false), N2S(null, null, false), N2E(null, null, false), W2E(null, null, false), W2N(null, null, false), S2E(null, null, true), E2N(null, null, true), N2W(null, null, true), W2S(null, null, true);private Lamp(String opposite, String next, boolean lighted) {this.opposite = opposite;this.next = next;this.lighted = lighted;}private Lamp() {}private boolean lighted;private String opposite;private String next;public boolean islighted() {return lighted;}public void light() {this.lighted = true;if (opposite != null) {Lamp.valueOf(opposite).light();}}public Lamp blackOut() {this.lighted = false;if (opposite != null) {Lamp.valueOf(opposite).blackOut();}Lamp nextLamp=Lamp.valueOf(next);if(next!=null){nextLamp.light();}return nextLamp;}}

LampControler.java

package com.isoftstone.interview.traffic;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class LampControler {private Lamp currentLamp;public LampControler(){currentLamp=Lamp.S2N;currentLamp.light();ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {currentLamp=currentLamp.blackOut();}},10, 10,TimeUnit.SECONDS);}}









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

0 0
原创粉丝点击