交通灯系统设计

来源:互联网 发布:java socket实例 编辑:程序博客网 时间:2024/06/01 07:46

------- android培训、java培训、期待与您交流! ----------
刚开始一想起是一个系统,心里就有点怵,但是慢慢的跟着老师的思路走,也是能懂的!
一、模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:

异步随机生成按照各个路线行驶的车辆。
例如:
       由南向而来去往北向的车辆 ---- 直行车辆
       由西向而来去往南向的车辆 ---- 右转车辆
       由东向而来去往南向的车辆 ---- 左转车辆
       。。。

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

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

具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
 
每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。

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

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

二:代码实现
road类.功能一随机增加路面车辆,二根据相应灯的状态,来决定是否放行车辆
import java.util.*;
 public class Road {
  private List<String> vechicles = new ArrayList<String>();
  private String name =null;
  public Road(String name){
   this.name = name; 
   ExecutorService pool = Executors.newSingleThreadExecutor();
   pool.execute(new Runnable(){
    public void run(){
     for(int i=1;i<1000;i++){
      try {
       Thread.sleep((new Random().nextInt(10) + 1) * 1000);
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
      vechicles.add(Road.this.name + "_" + i);
     }  
    }  
   }); 
   ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);
   timer.scheduleAtFixedRate(
     new Runnable(){
      public void run(){
       if(vechicles.size()>0){
        boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
        if(lighted){
         System.out.println(vechicles.remove(0) + " is traversing !");
        }
       }
      }
     },
     1,
     1,
     TimeUnit.SECONDS); 
  }
 }
 
Lamp类.提供12个方向灯,并提高检测状态和改变状态的方法
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 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();
   }
   System.out.println(name() + " 2条直行路线,2条左转路线,2条右转路线");
 
  }
  public Lamp blackOut(){
   this.lighted = false;
   if(opposite != null){
    Lamp.valueOf(opposite).blackOut();
   }
   Lamp nextLamp= null;
   if(next != null){
    nextLamp = Lamp.valueOf(next); 
    nextLamp.light();
   }
   return nextLamp;
  }
 }
LampController类.主要实现定时对灯的状态改变,从而实现对路面车辆通行的控制
import java.util.*;
  public class LampController {
   private Lamp currentLamp;
   public LampController(){
    currentLamp = Lamp.S2N;
    currentLamp.light();  
    ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);
    timer.scheduleAtFixedRate(
      new Runnable(){
       public  void run(){
        currentLamp = currentLamp.blackOut();
      }
      },
      10,
      10,
      TimeUnit.SECONDS);
   }
  }

 
 ------- android培训、java培训、期待与您交流! ----------   详细请查看:http://edu.csdn.net/heima/

原创粉丝点击