黑马程序员_交通灯系统简单讲述

交通灯系统

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

    编写代码实现:

    1,Lamp.java
    //定义一个Lamp枚举类,12个灯作为枚举对象。 

    public enum Lamp {
            //由上述分析可知只需设计四个方向上的灯有逻辑。 

            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 boolean lighted;

            private String opposite;

            private String next;
            //定义带参数的构造方法 

            private Lamp(String opposite,String next,boolean lighted){  
            //此处相对的灯不能用Lamp传参,因为枚举类型是先定义后使用,解决办法:传灯的名字。

                    this.opposite = opposite;

                    this.next = next;

                    this.lighted = lighted;

            }

            public boolean isLighted(){

                    return lighted;

            }

            public void light(){

                    this.lighted = true;

                    if(opposite != null)      //做判断,防止死循环

                            Lamp.valueOf(opposite).light();

                    System.out.println(this.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("绿灯从"+this.name()+"方向----切换为---->"+next+"方向");

                            nextLamp.light();

                    }

                    return nextLamp;     //返回下一个灯。

            }

    }

    2,LampController.java        //灯的控制系统

    import java.util.concurrent.Executors;

    import java.util.concurrent.ScheduledExecutorService;

    import java.util.concurrent.TimeUnit;

    public class LampController {

           private Lamp currentLamp;

           public LampController(){

                  currentLamp = Lamp.S2N;  //默认一个当前灯,也可以作为参数传进来。

                  currentLamp.light();
                  //做一个定时器,时间一到就把当前灯变红,并得到下一个变绿的灯 

                  ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);

                  timer.scheduleAtFixedRate(

                                     new Runnable() {

                                             public void run() {

                                                    currentLamp = currentLamp.blackOut();

                                             }}, 

                                      10, 10, TimeUnit.SECONDS);

           }

    }

    3,Road.java

    import java.util.ArrayList;

    import java.util.List;

    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 {

           private List<String> vechicle = new ArrayList<String>();

           private String name = null;

           public Road(String name){

                  this.name = name;
                  //采用JDK1.5提供的多线程,效率更高。 此处只需要一个单独线程。

                  ExecutorService pool = Executors.newSingleThreadExecutor();

                  pool.execute(new Runnable() {

                          public void run() {
                                 //设定这个路口通过999辆车 

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

                                         try {
                                                 //每隔1~10秒随机产生一辆车。 

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

                                         } catch (InterruptedException e) {

                                                e.printStackTrace();

                                         }

                                         vechicle.add(Road.this.name+"_"+ i);
                                         //局部匿名内部类调用外部类的成员变量,若调用该局部变量,则局部变量必须被final修饰。

                                 }

                         }

                  });
                 //定义一个定时器。 每隔1秒从集合中取出一辆车

                 ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);

                 timer.scheduleAtFixedRate(

                         new Runnable() {

                                 public void run() {

                                        if(vechicle.size()>0){

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

                                                if(lighted){

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

                                                }

                                         }

                                  }

                           }, 

                           1,

                           1, 

                           TimeUnit.SECONDS);          

            }

    }

    4,MainClass.java        //定义一个测试类。

    public class MainClass {

            public static void main(String[] args) {

                    String[] directions = new String[]{

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

                    };
                    //new出12条路。利用高级for循环 

                    for(String direction:directions)

                            new Road(direction);
                    //new出灯控制器。

                    new LampController();

            }

    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值