交通灯管理系统


       今天看了张老师的交通灯管理系统项目视频,感到很惊讶,一个我认为很大的一个项目,被张老师个把小时不到百行的代码给搞定了,而且里边的业务逻辑都实现.实在是不可思议.想起自己写一个小功能就搞了一行有一行代码,,不知道写程序什么时候能够达到张老师的这种境界.

     以前感觉程序员就是一个很木讷的职业,做程序员的人都是很死板的人.现在没这种感觉了.一个程序它就是为了解决现实生活中的很多问题而存在的,一个好的程序必须是有活力的,是有血有肉的,所以一个好的程序员必须是有活力,有血有肉的.它写出来的程序能体现出自己的智慧,当别人读它的程序的同时也在了解这个人.

     一个好的程序员必须是热爱生活的,所以在生活中时刻保持一个很高的洞察力,注意观察生活中的每个细节,只有对生活了解了,对生活中的狠多逻辑在自己的脑海中都有一定的条理性.这样才能写出好的程序.

     就像这个交通灯管理系统,今天不仅吸收了张老师的一点思想.而且还知道了一个交通灯怎么维持一个十字路口的秩序.但看了一遍很多地方还是不能理解透.还需要多看几遍.


线程池

之前没学过线程池,此项目队线程池的运用比较多。所以讲线程池的时候不知道什么概念.查了一下.

线程池就是事先开好的一堆线程,当然,这些线程都在睡眠中了。这一堆线程就叫线程池

然后当有需求的就拿出一个线程来用,用完后不退出,接着放回池子里去。

这样就避免了线程创建的开销,当有频繁的线程出现的时候对性能有比较大的好处。



交通灯管理系统项目需求

 

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

例如:

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

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

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

。。。

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

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

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

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

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

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

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



项目分析:

 

黑马程序员--交通灯管理系统

 

路线:

路线一共有12,4条往右行路线不用判断红绿灯直接通过.剩余8条路线.

:当南到北的线路是绿灯时,那么北到南的线路也是路灯

所以除了右行4条路线,剩余4对对应路线.所以红绿灯变换4才能把12条路线的车全部通过一次.红绿灯每个状态下有6条路线在通车

 


(一)首先创建一个Road对象,路上行驶的车用一个List集合装上,每条线路上每通过一辆车就从List集合中删除一个元素


public class Road {

private List vechicles = new ArrayList();

 

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 {  //用一个随机数来控制路上增加的车辆,随机1-10

Thread.sleep((new Random().nextInt(10) + 1) * 1000);

} catch (InterruptedException e) {

e.printStackTrace();

}                               //内部类访问外部类的变量需要这样用,不然访问不到

vechicles.add(Road.this.name + "_" + i);

                               

}

 

});

/ *

定义一个定时器:每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿。

定时器:第一个参数new Runnable()是个接口加上大括号表示实现这个接口的类要重写run这个方法,第二个参数是表示什么时间开始,第三个参数表示多久再次执行,第四个参数表示用什么时间单位

 * /

//每隔一秒检查对应的灯是否为绿,是则放行一辆车                

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条路线,除了4条右行的路线外,只需要控制4组路线即可,一组路线的灯变绿的同时会有一组路线的灯变红。这个类设为枚举类。

 

public enum Lamp {

//参数第一个是与之对应的路线的灯,它们的灯是同样的。第二个是是下一个灯。第三个boolean型参数就//是灯的状态是否为绿灯。        

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() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");

 

}

 

//将自己和对应灯改为红灯的同时把下一个灯变为绿灯

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 LampController(){

currentLamp = Lamp.S2N;//刚开始让由南向北的灯变绿;

currentLamp.light();

 

//每隔5秒将当前绿灯变为红灯,并让下一个方向的灯变绿                

ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(

new Runnable(){

public  void run(){

currentLamp = currentLamp.blackOut();

}

},

5,

5,

TimeUnit.SECONDS);

}

 


(四)

 

public static void main(String[] args) {

 

//创建12条方向录像                

String [] directions = new String[]{

"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"                

};

for(int i=0;i

new Road(directions[i]);

}

 

//创建一个灯系统控制器                

new LampController();

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值