`

黑马程序员_面试题_对交通灯管理系统总结

 
阅读更多

------- Windows Phone 7手机开发.Net培训、期待与您交流! -------

1.         枚举类的特点;

枚举类不能在外面单独创建对象;

2.         对于系统中灯的设计,使用了枚举类;

设计情况;

每个枚举元素各表示一个方向的控制灯,每一个枚举类都是一个实例对象;

注明;4个灯依次亮;

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);

创建一个构造函数,必须是私有的;参数的意义;opposite对应的灯;next下一个灯;lighted是否是绿色的;

private Lamp(String opposite,String next,boolean lighted){

                   this.opposite = opposite;

                   this.next = next;

                   this.lighted = lighted;

         }

3.         枚举类里面实现了两个方法;

其中Lamp.valueOf(opposite).light();返回的是一个Lamp灯的对象;就是一个枚举类的对象;下面是这两个方法的具体实现;

 

某个灯变绿时,它对应方向的灯也要变绿,灯变绿的方法;

public void light(){

this.lighted = true;

if(opposite != null){

将字符串变成对象;Lamp.valueOf(opposite)返回的是灯的对象;

Lamp.valueOf(opposite).light();

         }

System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");

System.out.println(name() + " lamp is green,四个不受控制的一直是亮的,两个受控制的;");

}       

灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿

@return 返回下一个要变绿的灯

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;

}

4.         对于灯的变化时间,我们是通过线程实现的;代码如下;

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

*参数nThreads代表 -池中的线程数

                   ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)

        command - 要执行的任务

             initialDelay - 首次执行的延迟时间

                   period - 连续执行之间的周期

                   unit - initialDelay period 参数的时间单位 

                   timer.scheduleAtFixedRate(

                                     new Runnable(){

                                               public  void run(){

                                                        System.out.println("来啊");

//                                                     返回下一个变亮的灯;

                                                        currentLamp = currentLamp.blackOut();

                                     }

                                     },

                                     10,

                                     10,

                                     TimeUnit.SECONDS);

         }

5.         在路上不断的添加车辆;

//模拟车辆不断随机上路的过程

Executors这个是一个java线程并发库工具类。里面有大量的静态方法;是一个执行器类;

ExecutorService pool = Executors.newSingleThreadExecutor();             

pool.execute(new Runnable(){

public void run(){                                 

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

try {

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

} catch (InterruptedException e) {

         e.printStackTrace();

}

//访问外部类中的成员变量;

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

                                     }                                   

                            }

                           

                   });

6.         再用一个定时线程判断我们这个灯是不是亮着的;

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

newScheduledThreadPool是定时器;

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);

7.         对于交通灯管理系统的总结;

1、用到了枚举类;

2、用到了定时线程和不定时线程

3、用到了集合;

4Executors这个是一个java线程并发库工具类。里面有大量的静态方法;是一个执行器类;

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics