前言:天生东南西北不分理论看起来有点吃力......

简单来说交通灯管理系统——分为交通灯的定义、交通灯的控制、路面这3各部分。根据视频的大意 
交通灯的定义:利用枚举写出了轮廓 在4个需要判断红绿灯颜色的路指定对应相反的路和切换时的下一个路,交通灯的红绿变换。 
控制:在令其一个类写了通过时间来控制切换灯的平率达到控制的目的。
路: 利用2个线程 一个不断产生车装入LIST集合中 实现有车驶入这条路的效果 另个判断路所对应的红绿灯是否是绿灯 是就不断删去LIST中的第一个元素 达到车看到绿灯驶过的效果。

通过主函数产生12条路的对象 即:


 

用java写一个控制红绿灯的程序_构造函数

如图 中的12条路,及交通灯管理器进行程序的实现。

 

详细分析 交通灯:

 

public enum Lamp {  
//以南到北为例(S2N):括号中 第一个字符串 表示对应的相反车道北到南(N2S) 第二个表示 当绿转红后的下一个变为路灯的道路名 第三个表示信号灯的初始化状态
    S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),   
   //由于上面涉及到了所以第二行的道路全以NULL空代替     
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() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");  
  

  
}  
  

  
/**  
  
* 某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿  
  
* @return 下一个要变绿的灯  
  
*/   
  
public Lamp blackOut(){  
  
this.lighted = false;  
  
if(opposite != null){//对有无对应相反车道的判断 有就让相反车道灯关闭  
  
Lamp.valueOf(opposite).blackOut();  
  
}   
  

  
Lamp nextLamp= null;  
  
if(next != null){//判断有无下一个信号灯 有的话让下个灯亮起   
  
nextLamp = Lamp.valueOf(next);  
  
System.out.println("绿灯从" + name() + "-------->切换为" + next);   
  
nextLamp.light();  
  
}  
  
return nextLamp;  
  
}  
 }   

 交通灯管理器:public class LampController {  
private Lamp currentLamp;  
  

  
public LampController(){  
  
//刚开始让由南向北的灯变绿;   
  
currentLamp = Lamp.S2N;  
  
currentLamp.light();  
  

  
/*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/   
  
ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);//话说这毕老师的视频里没有啊 还是我漏下了   
  
timer.scheduleAtFixedRate(//基本意思是定义个线程执行器 程序激活后等10秒执行 执行以后每10秒执行一次  
  
new Runnable(){  
  
public  void run(){  
  
System.out.println("来啊");  
  
currentLamp = currentLamp.blackOut();  
  
}  
  
},  
  
10,  
  
10,  
  
TimeUnit.SECONDS);  
  
}  
 }   
    
 路:public class Road {  
private List<String> vechicles = new ArrayList<String>();//定义集合 就把他看成路吧   
  
private String name =null;  
  
public Road(String 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);//在1-10秒里产生一辆车  
  
} catch (InterruptedException e) {  
  
e.printStackTrace();  
  
}  
  
vechicles.add(Road. + "_" + i);//装进集合(路)里  
  
}   
  
}  
  

  
});  
  

  
//每隔一秒检查对应的灯是否为绿,是则放行一辆车   
  
ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);  
  
timer.scheduleAtFixedRate(  
  
new Runnable(){  
  
public void run(){  
  
if(vechicles.size()>0){//检查是否有车  
  
boolean lighted = Lamp.valueOf(Road.).isLighted();  
  
if(lighted){//如果信号灯为真(绿灯)  
  
System.out.println(vechicles.remove(0) + " is traversing !");//删除集合中的第一个元素(即 //:排第一的车开走了)  
  
}  
  
}  
  

  
}  
  
},  
  
1,  
  
1,  
  
TimeUnit.SECONDS);  
  

  
}  
 }

学习感悟:方向搞了老半天   搞清楚了方向  把十字路口看成 12条单行道就行了。