黑马程序员技术交流社区

标题: 黑马程序员-------交通灯管理系统(2)具体各类代码的分析 [打印本页]

作者: mmakun    时间: 2015-5-29 22:55
标题: 黑马程序员-------交通灯管理系统(2)具体各类代码的分析
-----<a  target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
        这个 帖子接交通灯管理系统(1)。
        以下是根据具体代码对各种类的分析:

        产生车辆的Road类:
       
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Road {

       
                // TODO Auto-generated method stub
                List<String> vechicles=new ArrayList<String>();//集合,用来产生带名字的车辆
                private String name;//用来标识这个Road的名称
               
                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 {
                                                        int random= new Random().nextInt(10);
                                                        Thread.sleep((random+1)*1000);
                                                        vechicles.add(Road.this.name+i);//每隔一段 时间产生一个带名字的车
                                                } catch (InterruptedException e) {
                                                        // TODO Auto-generated catch block
                                                        e.printStackTrace();
                                                }
                                               
                                        }
                                }
                        });
                        ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
                       
                        timer.scheduleAtFixedRate(                                       
                                        new Runnable(){
                                                public void run(){
                                                        if(!vechicles.isEmpty()){//判断可通行的路上的车有没有
                                                                boolean lighted=Lamp.valueOf(Road.this.name).isLighted();//有的话,再判断这个线路是否可以通行呢
                                                                if(lighted){
                                                                        System.out.println(vechicles.remove(0)+" is tranversing!");//若可以通行,则通行
                                                                }
                                                        }
                                                }
                                        },
                                        1,
                                        1,
                                        TimeUnit.SECONDS);               
                       
                }

}
        控制车辆运行的灯的类Lamp:
public enum Lamp {
        //先把灯的各种类型枚举出来
        S2N("N2S","S2W",false),S2W("W2S","E2W",false),E2W("W2E","E2S",false),E2S("S2E","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 Lamp(String opposite,String next,boolean lighted){//定义一个包含对方向的灯、下个时刻要亮的灯、灯是否亮的标志的构造函数
               
                this.opposite=opposite;
                this.next=next;
                this.lighted=lighted;
        }
       
        private Lamp(){
               
        }
       
        private boolean lighted;//指示灯的状态 (能不能通行)
        private String  opposite;        //指示对面的灯
        private String next;//指示下一时刻要亮的灯
       
       
        public boolean isLighted(){//一个公共方法,判断这个灯是否亮了
                return lighted;
        }
        public void light(){//点亮本灯的方法
                this.lighted=true;//把本灯点亮
               
                if(this.opposite!=null)//判断对面的灯是否为空,然后把对面的灯也点亮 ,这个 判断不可缺少,如果缺少,就会陷入循环调用light()方法的死循环
                       
                        Lamp.valueOf(opposite).light();
        }
        public Lamp blackOut(){//把本灯熄灯,同时把对面的灯熄灭,同时,返回下一个灯,这也是为了方便控制,返回下一个要点亮的灯。
                this.lighted=false;
                if(this.opposite!=null)
                        Lamp.valueOf(opposite).blackOut();
               
                if(this.next!=null)
                        Lamp.valueOf(next).light();
                return Lamp.valueOf(next);
        }
       
       
}


        控制灯运行方式的LampController类:
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();//把当前的灯由false改为true,就是
                ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);//创建线程池
                timer.scheduleAtFixedRate(//周期运行一个线程
                                new Runnable(){
                                        public void run(){
                                                currentLamp=currentLamp.blackOut();
                                        }
                                }, 10, 10, TimeUnit.SECONDS);
        }
       
       

}
        启动程序的MainClass方法:
public class MainClass {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                String[] directions=new String[]{
                                "S2N","S2W","S2E","E2N","E2S","E2W","N2S","N2E","N2W","W2S","W2E","W2N"
                };//列出类的名称
                for(String i:directions)
                        new Road(i);//通过名称实例化出各Road类
                new LampController();//实例化出控制系统
        }

}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2