黑马程序员_java 交通信号灯系统

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------


1.分析模型


总共有12条路线,为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的4条路线的控制灯可以假设称为常绿状态,另外,其他的8条线路是两两成对的,可以归为4组,所以,程序只需考虑图中标注了数字号的4条路线的控制灯的切换顺序,这4条路线相反方向的路线的控制灯跟随这4条路线切换,不必额外考虑。

2.设计类

       ·Road类

1.Executors.newSingleThreadExecutor()创建一个线程,其中run()方法内部代码的功能是随机产

生车辆;

ExecutorService pool=Executors.newSingleThreadExecutor();

              pool.execute(new Runnable(){

                  public void run(){

                     for(inti=1;i<1000;i++){

                  try {

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

                  } catch (InterruptedException e) {

                     e.printStackTrace();

                  }

                  //将产生的车辆添加到集合中

                  vehicles.add(Road.this.name+"的第"+i+"辆车");

              }

           }

     });

2.用Executors.newScheduledThreadPool(1)创建一个线程,其中run()方法内部的代码功能是检查对应道路的灯是否为绿灯,是,则将集合中的元素删除;即放行车辆。

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

       ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);

       timer.scheduleAtFixedRate(

              new Runnable(){

                  public void run(){

                     if(vehicles.size()>0){

                         boolean lighted=Lamp.valueOf(Road.this.name).isLighted();

                         if(lighted){

                            System.out.println(vehicles.remove(0)+" is traversing !!!");

                         }

                     }

                  }

              },

              1,

              1,

              TimeUnit.SECONDS);

}

       ·Lamp类

         Lamp类是一个枚举类,该类首先要定义每条道路上的灯,共十二个;其中该类中的方法应该有:

           1.判断灯是否是绿灯

                  public boolean isLighted(){

                     return lighted;

                  }

           2.将绿灯变成红灯的方法(注意此时应该让下一个变成绿灯)

                  public void light(){

                     this.lighted=true;

                         if(opposite!= null){

                             Lamp.valueOf(opposite).light();

                         }  

                 }

           3.让灯变成绿灯的方法(要注意的是该等变成绿灯后对应的方向的灯也要变成绿灯)

                  public Lamp blackOut(){

                     this.lighted=false;

                     if(opposite!=null){

                         Lamp.valueOf(opposite).blackOut();

                     }

                     LampnextLamp=null;

                     if(next!=null){

                         nextLamp=Lamp.valueOf(next);

                         System.out.println("green light from"+name()+"---to---"+next);

                         nextLamp.light();

                     }

                     return nextLamp;

             }

       ·LampController类

            用Executors.newScheduledThreadPool(1)定义一个定时器,其中run()方法内代码的功能是

           隔一段时间让那个当前的等改变颜色并且使下一个方向的灯变成相反的颜色

public class LampController {

                  private Lamp currentLamp;

                  public LampController(){

                     //任意选择一个方向的灯变成绿灯

                     currentLamp=Lamp.S2N;

                     currentLamp.light();

                     //每隔一定时间让当前绿灯变红,并且下一个方向的灯变绿

       ScheduledExecutorServicetimer=Executors.newScheduledThreadPool(1);

                     timer.scheduleAtFixedRate(

                            new Runnable(){

                                public void run() {

                                   currentLamp=currentLamp.blackOut();

                                }

                            },

                            10,

                            10,

                            TimeUnit.SECONDS);

                  }

}

 

       ·MainClass类

             创建十二个信号灯的对象;创建LampController对象即可。

            String[] deStrings=new String[]{

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

       for(int i=0;i<deStrings.length;i++){

           new Road(deStrings[i]);

       }

       new  LampController();

      }


---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值