黑马程序员----交通系统

         听了这节课后,我最大的感觉反而不是在于这个项目本身,而是张老师传达的一种信念,是我看到一种真正的程序员的精神,里面点评到有关对象的时候讲的真是非常的到位,就像JAVA编程思想中说的那样万物皆对象,曾经觉得类是对象的抽象我记得教课书上是这么说的,只是这么一听下来其实类其实也是一种对象,而现实对象又远处不在,你或者现在看文章的人都是一种类也是一种对象。

         今天,浏览博客的时候无意间看到张老师离世的消息,内心久久不能平静,想起以前在学校的时候曾无数多听过他的课,而现在又再次听他的课,可是人却不在了,真是一个行业的崛起必然需要很多的勇士化为一个个烈士,也许他所播下的种子定然也会传达他的信念,张老师天堂的你并不会孤单,也许技术并不一定是要多么高深,但是一定要让成为一种信仰。

枚举的变量必须是私有类型

定义一个定时器的方法如下

Executors.newScheduledThreadPool(corePoolSize)

ScheduledExecutorService提供了按时间安排执行任务的功能,它提供的方法主要有:

schedule(task,initDelay):安排所提交的Callable或Runnable任务在initDelay指定的时间后执行。

scheduleAtFixedRate():安排所提交的Runnable任务按指定的间隔重复执行

 

 

透过上面的的图可以分解成十二条线路,然后12条真正需要考虑的只有四条然后通过枚举的形式如下。

S2N("N2S","S2W",false)代表是向前方向地南到北的红绿灯可以行走的线路

   /*每个枚举元素各表示一个方向的控制灯*/

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

红绿灯的开关来控制方向

/**

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

     */

    public void light(){

       this.lighted = true;

       if(opposite != null){

           Lamp.valueOf(opposite).light();

       }

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

      

    }

   

    /**

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

     * @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;

    }

 

LampController是控制灯的开关,采用的是ScheduledExecutorService来实现每十秒灯开关一次

public class LampController {

    private Lamp currentLamp;

   

    public LampController(){

       //刚开始让由南向北的灯变绿;   

       currentLamp = Lamp.S2N;

       currentLamp.light();

      

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

       ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);

       timer.scheduleAtFixedRate(

              new Runnable(){

                  public  void run(){

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

                     currentLamp = currentLamp.blackOut();

              }

              },

              10,

              10,

              TimeUnit.SECONDS);

    }

}

package com.isoftstone.interview.traffic;

 

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;

 

/**

 * 每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。

 * 每条路线上随机增加新的车辆,增加到一个集合中保存。

 * 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。

 * @author 张孝祥 www.it315.org

 *

 */

public class Road {

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

        

         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 {

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

                                               } catch (InterruptedException e) {

                                                        e.printStackTrace();

                                               }

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

                                     }                                   

                            }

                           

                   });

                  

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

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

                  

         }

}

posted @ 2012-02-20 23:06  夜风雪  阅读(419)  评论(1编辑  收藏  举报