java 自学日志【二十二】 张老师-交通灯管理系统

心得体会:通过看了张老师的基础加强视频,和两个面试视频,总的体会是学到的还不够多,还跟不上老师的节奏,而且老师将的内容有些也超出了基础视频,理解有些难度,关键还是要温故而知新;另外张老师的视频可能有些年头了,音质方面再加上张老师有点南方口音,有些地方听的很模糊,但对于基础不好的我还得多看几遍视频,短短一个月的时间理解肯定是不会透彻的!所以这些视频要反复的看!加强记忆!

交通灯管理系统的视频里面提到了servlet,类图等等的,对我来书都是陌生点,视频强掉了面向对象编程的思想,张老师的举例也分的透彻,还得多看几遍加深记忆和理解;

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

二、系统分析
1.名词提炼法-------要求中涉及的名词:车辆,路线,信号灯;三者之间的关系,每条线路上都有不同信号灯和车辆。
2.设计模型:
    十字路口共有12条路线,其中四条右转线路一直处于通行状态,其余8条线路,可分为方向相对的四组,每一组路线上的红绿灯状态一致,每组选取一条线路组成四条切换灯状态的线路。
     线路模型:有自己的名字,车辆池,已建立就异步产生车辆和移动车辆,并根据其上的交通灯判断是否移除车辆。
    交通灯模型:使用枚举,它记录对面的灯,以实现每组灯状态一致;记录下一个灯,以实现切换状态
    交通灯控制系统模型:记录当前亮着的主控制灯,并定时切换。
3. 路线示意图


三、代码实现:
//1.Road   
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 {  
    /* 
     * 每条路线,都有自己的名字(name),用于存储车辆的集合(vehicles)。名字和它身上的红绿灯同名,以此获取交通灯枚举(Lamp) 
     * 同时,每条路线,已生成就应该不停的 随机 产生车辆和 定时移走车辆 
     */  
    private String name;//路线名,与路上的红绿灯同名  
    private ArrayList<String> vehicles = new ArrayList<String>();//用于存储本线路上的车辆  
      
    public Road(String name){  
        this.name=name;  
        //随机产生车辆  
        ExecutorService carMaker=Executors.newSingleThreadExecutor();  
        carMaker.execute(new Runnable(){  
            @Override  
            public void run() {  
                for(int x =0;x<1000;x++){  
                    //通过sleep方法控制产生车辆的时间间隔,把握节奏  
                    try {  
                        Thread.sleep((new Random().nextInt(10)+1)*1000);//这里用随机数,以更逼近现实。  
                    } catch (InterruptedException e) {                        
                        e.printStackTrace();  
                    }  
                    //为通过的车辆编号,并增加到集合中,这里的name有两个,一个构造传进来的参数,一个是外部类的成员变量,所以要区分下  
                    vehicles.add(Road.this.name+"_"+x);  
                }  
                  
            }  
              
        });  
        //每个1秒移走车辆,用定时器实现操作  
        ScheduledExecutorService carMoveTimer=Executors.newScheduledThreadPool(1);  
        carMoveTimer.scheduleAtFixedRate(  
                new Runnable(){  
                    @Override  
                    public void run() {  
                        //如果路上有车且路上的交通灯为绿才移走车辆  
                        if(vehicles.size()!=0){  
                            //通过路的名字获取其交通灯,并判断交通灯是否亮  
                            boolean lighted=Lamp.valueOf(Road.this.name).isLighted();  
                            if(lighted){  
                                //remove(int index)返回的是移走的那个元素  
                                System.out.println(vehicles.remove(0)+"----正在穿过路口");  
                            }  
                        }  
                          
                    }                     
                },   
                0,   
                1,   
                TimeUnit.SECONDS);        
    }  
      
}  
//2.交通灯Lamp类
/* 
 每个灯,含有三个属性:是否亮(lighted),对面的灯(opposite),下一个要亮的灯(nextLamp); 
 三个方法:是否亮(boolean lighted),灯转亮(light()),灯熄灭(breakout()) 
  
 */  
  
public enum Lamp {    
    //四个主控制灯,交替顺序:先南向北,然后左转,再东向西,然后左转  
    S2N("S2W","N2S",false),S2W("E2W","N2E",false),E2W("E2S","W2E",false),E2S("S2N","W2N",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 boolean lighted;  
    private String opposite;  
    private String next;  
      
    private Lamp(String next,String opposite, boolean lighted) {      
        this.next = next;  
        this.opposite = opposite;         
        this.lighted = lighted;  
    }     
      
    public boolean isLighted() {          
        return lighted;  
    }  
      
    public void light(){  
        this.lighted=true;        
        if(this.opposite!=null){  
            Lamp.valueOf(opposite).light();           
        }  
        System.out.println(name() + " is Green,下边应该有6个方向能够看到汽车通过");   
    }  
      
  
    public Lamp breakout(){  
        this.lighted=false;       
        if(opposite!=null){//应该判断是否为空,以免陷入死循环  
            Lamp.valueOf(opposite).breakout();            
        }  
        Lamp nextLamp =null;  
        if(next!=null){//应该判断是否为空,以免陷入死循环  
            nextLamp=Lamp.valueOf(next);  
            nextLamp.light();  
            System.out.println("绿灯从"+name()+"--------->切换为"+next);  
        }         
        return nextLamp;  
    }  
}  
//3.交通灯控制器LampController类:
import java.util.concurrent.Executors;  
import java.util.concurrent.ScheduledExecutorService;  
import java.util.concurrent.TimeUnit;  
  
/* 
 交通灯控制器,记录当前亮的灯 
 */  
public class LampController {  
    private Lamp currentLamp=Lamp.S2N;    
    LampController() {  
        super();  
        currentLamp.light();      
        //定期将当前亮着的灯熄灭。  
        ScheduledExecutorService constrollTimer =Executors.newScheduledThreadPool(1);  
        constrollTimer.scheduleAtFixedRate(  
                new Runnable(){  
                    @Override  
                    public void run() {  
                        currentLamp = currentLamp.breakout();     
                          
                    }                     
                },   
                10, //这里要延迟10s,否则一开始会有8条路的绿灯都是亮的,而是将只应该有4条  
                10,   
                TimeUnit.SECONDS);  
    }  
  
}  

//4.运行启动类:MainClass
public class MainClass {  
   
 public static void main(String[] args) {  
  //生成十二条路线  
  String[] roadNames={"S2N","S2W","E2W","E2S",  
    "N2S","N2E","W2E","W2N",  
    "S2E","E2N","N2W","W2S"};   </p><p>  for(int x=0;x<12;x++){  
   new Road(roadNames[x]);  
  }  
  //启动交通灯控制器  
  new LampController();  
    
 }  
5.运行结果:


N2S is Green,下边应该有6个方向能够看到汽车通过
S2N is Green,下边应该有6个方向能够看到汽车通过
S2E_0----正在穿过路口
N2S_0----正在穿过路口
N2W_0----正在穿过路口
N2S_1----正在穿过路口
S2E_1----正在穿过路口
W2S_0----正在穿过路口
S2N_0----正在穿过路口
S2E_2----正在穿过路口
N2S_2----正在穿过路口
N2W_1----正在穿过路口
E2N_0----正在穿过路口
N2E is Green,下边应该有6个方向能够看到汽车通过
S2W is Green,下边应该有6个方向能够看到汽车通过
绿灯从S2N--------->切换为S2W
S2W_0----正在穿过路口
N2E_0----正在穿过路口
N2E_1----正在穿过路口
S2W_1----正在穿过路口
N2E_2----正在穿过路口
S2E_3----正在穿过路口
W2S_1----正在穿过路口
S2E_4----正在穿过路口
N2W_2----正在穿过路口
E2N_1----正在穿过路口
S2E_5----正在穿过路口
W2S_2----正在穿过路口
W2E is Green,下边应该有6个方向能够看到汽车通过
E2W is Green,下边应该有6个方向能够看到汽车通过
绿灯从S2W--------->切换为E2W
E2W_0----正在穿过路口
W2E_0----正在穿过路口
E2W_1----正在穿过路口
W2E_1----正在穿过路口
E2N_2----正在穿过路口
N2W_3----正在穿过路口
E2W_2----正在穿过路口
W2E_2----正在穿过路口
W2E_3----正在穿过路口
E2N_3----正在穿过路口
S2E_6----正在穿过路口
E2W_3----正在穿过路口
E2N_4----正在穿过路口
W2E_4----正在穿过路口
S2E_7----正在穿过路口
E2W_4----正在穿过路口
W2E_5----正在穿过路口
W2S_3----正在穿过路口
W2N is Green,下边应该有6个方向能够看到汽车通过
E2S is Green,下边应该有6个方向能够看到汽车通过
绿灯从E2W--------->切换为E2S
E2S_0----正在穿过路口
W2N_0----正在穿过路口
N2W_4----正在穿过路口
E2S_1----正在穿过路口
W2N_1----正在穿过路口
E2S_2----正在穿过路口
W2N_2----正在穿过路口
E2S_3----正在穿过路口
W2N_3----正在穿过路口
E2S_4----正在穿过路口
W2N_4----正在穿过路口
E2S_5----正在穿过路口
W2N_5----正在穿过路口
E2N_5----正在穿过路口
W2N_6----正在穿过路口
W2S_4----正在穿过路口
S2E_8----正在穿过路口
E2N_6----正在穿过路口
W2S_5----正在穿过路口
N2W_5----正在穿过路口
N2S is Green,下边应该有6个方向能够看到汽车通过
S2N is Green,下边应该有6个方向能够看到汽车通过
绿灯从E2S--------->切换为S2N
S2N_1----正在穿过路口
N2S_3----正在穿过路口


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值