黑马程序员 Java自学总结二十一 张老师7K面试题之交通灯管理系统

来源:互联网 发布:oracle sql语句别名 编辑:程序博客网 时间:2024/05/08 13:33

------ ASP.Net+Android+IO开发.Net培训期待与您交流! ------

总结内容来源于张孝祥老师的7K面试题之交通灯管理系统


看过张老师的交通灯管理系统视频后,明显的感觉到了自己的基础还不够扎实,对于面对对象思想的理解还处于比较低级的层面,总体来说张老师对这套系统的讲解是比较细致,全面的,里面讲了之前没有看过的新知识点,JDK1.5版本中关于线程的新工具类Executors,和里面的定时器.总之这套视频教程不仅让我复习了一些原来学习的基础,又让我学习到了新的知识点,最重要的是对面对对象思想有了更进一步的了解.

交通灯管理系统

系统的需求

1.异步随机生成按照各个路线行驶的车辆。

例如:

       由南向而来去往北向的车辆 ---- 直行车辆

       由西向而来去往南向的车辆 ---- 右转车辆

       由东向而来去往南向的车辆 ---- 左转车辆

       。。。

2. 信号灯忽略黄灯,只考虑红灯和绿灯。

3. 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。

4.具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。

注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

5. 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。

6. 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

7. 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

系统的分析

分析示意图 , 如下


1 . Road(路线)

把路线单独定义一个类 , 

#创建线程 , 在路线中持续的产生车辆 , 并存入集合中 ,

#创建线程 , 引入条件 , 当前路线的灯为绿时 , 从集合中移出车辆并打印控制台     

2 . Lamp(交通灯)

图中共有12条路线 , 就可以看作为12个固定的交通灯 , 所以就想到了用Enum枚举 , 

由于向右拐弯是不受灯控制的 , 所以4条右转弯的灯一直为绿(true) ,  在剩下的8条路线中 , 路线是两两对应的  , S2N-N2S , S2W-N2E ,W2E-E2W , E2S-W2N , 并且第一组灯变红(false)时 , 第二组灯就变绿(true) , 依次往复 , 这样就明确的灯的对应和交替关系 .

3 . LampController(交通灯控制器)

主要控制那个路线的交通灯(Lamp)最先变绿(false) , 然后设置定时器按照固定的时间频率让每条线路变绿(true)变红(false)

下面是代码 : 

[java] view plaincopy
  1. package com.study.traffic;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. import java.util.Random;  
  5. import java.util.concurrent.ExecutorService;  
  6. import java.util.concurrent.Executors;  
  7. import java.util.concurrent.ScheduledExecutorService;  
  8. import java.util.concurrent.TimeUnit;  
  9. //路线类  
  10. public class Road {  
  11.     //创建一个用于存放车辆的集合,可当做为路上行驶的车辆  
  12.     private List<String> vehicles = new ArrayList<String>();  
  13.       
  14.     String roadName = null;  
  15.       
  16.     //构造方法传入路的名字,并在该条路上产生车辆,当交通等为绿色时,移出该条路的上的车辆  
  17.     Road(String roadName){  
  18.         this.roadName = roadName;     
  19.           
  20.         //要记住最关键的Executors(1.5版本后创建线程的新方法),其他自然能够引申出来  
  21.         ExecutorService pool = Executors.newSingleThreadExecutor();           
  22.         pool.execute(new Runnable(){  
  23.             @Override  
  24.             public void run() {  
  25.                 //车的最大数量为1000辆  
  26.                 for(int i=1; i<1000; i++){  
  27.                     try {  
  28.                         //每隔1-10秒,一辆车  
  29.                         Thread.sleep((new Random().nextInt(10)+1)*1000);  
  30.                     }   
  31.                     catch (InterruptedException e) {  
  32.                         e.printStackTrace();  
  33.                     }  
  34.                     //把车放进集合中  
  35.                     vehicles.add(Road.this.roadName+"_"+i);                   
  36.                 }  
  37.             }  
  38.         });  
  39.           
  40.         //定义一个计划的线程池,线程的数量为1  
  41.         ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);  
  42.           
  43.         //创建并执行此线程池,初始可以定时、并且后续具有周期性的方法.  
  44.         //用于当交通灯为绿色时,移出当前路上的车辆  
  45.         timer.scheduleAtFixedRate(  
  46.                 new Runnable(){  
  47.                     @Override  
  48.                     public void run() {  
  49.                         if(vehicles.size()!=0){                           
  50.                             boolean lighted = Lamp.valueOf(Road.this.roadName).isLighted();  
  51.                             if(lighted){  
  52.                                 System.out.println(vehicles.remove(0)+" is traversing");  
  53.                             }  
  54.                         }  
  55.                     }                     
  56.                 },  
  57.                 1,  
  58.                 1,  
  59.                 TimeUnit.SECONDS);  
  60.     }  
  61. }  
  62. package com.study.traffic;  
  63. //交通灯  
  64. public enum Lamp {  
  65.     //前四个灯为主控灯,括号内传入的分别是,"对应的灯","下一个灯",灯默认值  
  66.     S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),  
  67.     //中间四个灯为上面四个灯所对应的灯,并受其控制  
  68.     N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),  
  69.     //后四个为右转弯的灯,为常绿状态  
  70.     S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);  
  71.       
  72.     private Lamp(String opposite,String next,boolean lighted){  
  73.         this.opposite = opposite;  
  74.         this.next = next;  
  75.         this.lighted = lighted;  
  76.     }  
  77.       
  78.     private boolean lighted;  
  79.     private String opposite;  
  80.     private String next;  
  81.       
  82.     //定义一个可以判断灯是绿还是红的方法  
  83.     public boolean isLighted(){  
  84.         return lighted;  
  85.     }  
  86.     //灯变绿方法  
  87.     public void lightOn(){  
  88.         this.lighted = true;  
  89.         if(opposite != null){  
  90.             Lamp.valueOf(opposite).lightOn();  
  91.         }  
  92.         System.out.println(this.name()+"变绿");  
  93.     }  
  94.     //灯变红方法  
  95.     public Lamp lightOff(){  
  96.         this.lighted = false;  
  97.         if(opposite != null){  
  98.             Lamp.valueOf(opposite).lightOff();  
  99.         }  
  100.         System.out.println(next);  
  101.         Lamp nextLamp = null;  
  102.         if(next != null){  
  103.             System.out.println("绿灯由"+name()+"变成"+next);       
  104.             nextLamp = Lamp.valueOf(next);  
  105.             //System.out.println("test");  
  106.             nextLamp.lightOn();  
  107.         }  
  108.         return nextLamp;  
  109.     }  
  110. }  
  111. package com.study.traffic;  
  112.   
  113. import java.util.concurrent.Executors;  
  114. import java.util.concurrent.ScheduledExecutorService;  
  115. import java.util.concurrent.TimeUnit;  
  116. //交通灯控制器  
  117. public class LampController {  
  118.     private Lamp currentLamp = null;  
  119.     public LampController(){  
  120.         currentLamp = Lamp.S2N;  
  121.         currentLamp.lightOn();  
  122.           
  123.         //定时器,使灯按照固定的频率循环变绿和变红  
  124.         ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);  
  125.         timer.scheduleAtFixedRate(  
  126.                 new Runnable(){  
  127.                     public void run(){  
  128.                         //把下一个变绿的灯再次赋值给currentLamp  
  129.                         currentLamp = currentLamp.lightOff();  
  130.                     }  
  131.                 },  
  132.                 10,   
  133.                 10,  
  134.                 TimeUnit.SECONDS);  
  135.     }  
  136. }  
  137. package com.study.traffic;  
  138. //调用类  
  139. public class MainClass {  
  140.   
  141.     public static void main(String[] args) {  
  142.         String[] roadNames = new String[]{  
  143.                 "S2N","S2W","E2W","E2S",  
  144.                 "N2S","N2E","W2E","W2N",  
  145.                 "S2E","E2N","N2W","W2S"  
  146.                 };  
  147.         for(String roadName : roadNames){  
  148.             new Road(roadName);  
  149.         }  
  150.         new LampController();  
  151.     }  
  152. }  




------ ASP.Net+Android+IO开发.Net培训期待与您交流! ------

原创粉丝点击