黑马程序员_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.分析模型dom


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

2.设计类 spa

       ·Road类.net

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

生车辆;设计

ExecutorService pool=Executors.newSingleThreadExecutor();对象

              pool.execute(new Runnable(){blog

                  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>、期待与您交流! ----------------------