黑马程序员 JAVA学习笔记——交通灯管理系统

来源:互联网 发布:淘宝在美国 编辑:程序博客网 时间:2024/04/30 10:33

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

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

简单来说交通灯管理系统——分为交通灯的定义、交通灯的控制、路面这3各部分。根据视频的大意 
交通灯的定义:利用枚举写出了轮廓 在4个需要判断红绿灯颜色的路指定对应相反的路和切换时的下一个路,交通灯的红绿变换。 
控制:在令其一个类写了通过时间来控制切换灯的平率达到控制的目的。
路: 利用2个线程 一个不断产生车装入LIST集合中 实现有车驶入这条路的效果 另个判断路所对应的红绿灯是否是绿灯 是就不断删去LIST中的第一个元素 达到车看到绿灯驶过的效果。
通过主函数产生12条路的对象 即:
 
如图 中的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){//获取路名
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);//在1-10秒里产生一辆车
} 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);
}

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

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

0 0
原创粉丝点击