您的位置:首页 > 其它

交通灯控制系统

2016-06-09 10:36 351 查看
交通信号灯
分析:信号灯Lamp类 :
四个方向 12条路线被12个信号灯控制(忽略黄灯)红灯停绿灯行
"S2N","N2S","S2W","N2E","E2W","W2E","E2S","W2N",
每两个一组,一组灯同时变绿或变红,程序代码只需要控制每组灯中的一个灯即可

"S2E","N2W","E2N","W2S"

后两行的灯是虚拟的,由于从南向东和从西向北以及它们的对应方向不受红绿灯的控制

枚举 变量lighted opposite 方法 light  ;breakOut
-------------------------------------------------------------------------------------------------------------------
信号灯控制LampController类
初始由南到北的交通灯为绿 10s后转换为红 下一个方向opposite变绿
变量currentLamp     调用Executors类

-------------------------------------------------------------------------------------------------------------------
 道路类Road
每一个Road实例(对象)代表一个路线  共需12个road对象
每条路线上随机产生车辆  车辆放入集合中保存
每条路线每秒检查一次该路线是否为绿灯,是则移除集合中第一辆汽车
变量 LIstanbul<>vechicles ;name
//模拟车辆不断随机上路的过程

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

-------------------------------------------------------------------------------------------------------------------
主类Main
 12条路线放入一个集合 for(){批量创建}
调用信号灯控制类 
new LampController();
-------------------------------------------------------------------------------------------------------------------

package testtraffic;

/**

*

* @author guoshuai

*/

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 Lamp(String opposite, String next,boolean lighted) {

this.lighted = lighted;

this.opposite = opposite;

this.next = next;

}

private boolean lighted;

private String opposite;

private String next;

public boolean isLighted(){

return lighted;

}

/**

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

*/

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;

}

}

//***************************************************************************************************************

package testtraffic;

import java.util.Timer;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

/**

 *LampConraller 信号控制灯

 * currentLamp当前灯

 * @author guoshuai

 */

public class LampController {

    //构造器设初值 S2N为绿 亮

    private Lamp currentLamp;

    public LampController(){

    currentLamp=Lamp.S2N;

    currentLamp.light();

    

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

    

         ScheduledExecutorService Timer=Executors.newScheduledThreadPool(1);

         Timer.scheduleAtFixedRate(new Runnable() {

        @Override

        public void run() {

            currentLamp=currentLamp.blackOut();

                 }

                 },

                 2,

                 2, 

                 TimeUnit.SECONDS);

    }

}

//***************************************************************************************************************************

package testtraffic;

/**

 *创建12个交通路线

 * 开启交通灯管理

 * @author guoshuai

 */

public class MainClass {

    /**

     * @param args the command line arguments

     */

    public static void main(String[] args) {

        String []a=new String[]{"S2N","S2W","E2W",

            "E2S","N2S","N2E","W2E",

            "W2N","S2E","E2N","N2W","W2S"};

        //批量创建12条路线

        for (int i = 0; i < a.length; i++) {

            new Road(a[i]);

            

        }

        //启用信号灯系统

        new LampController();

    }

    

}

//*******************************************************************************************************************************************************88

    

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

/**

 *把路看成一个集合 放置产生的汽车 一秒通过一辆  当该路段交通灯为绿灯时 汽车-1

 * 总共12条路线 每条路线随机产生车辆 每条路每1秒判断一次(是否为绿线)

 * @author guoshuai

 */

public class Road {

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

     private String name;

     public Road(String name){

         this.name=name;

         //在构造器生产汽车

         ScheduledExecutorService ThreadPool=Executors.newScheduledThreadPool(1);

         ThreadPool.execute(new Runnable() {

             @Override

             public void run() {

                 for (int i = 0; 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() {

             @Override

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

     }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: