zoukankan      html  css  js  c++  java
  • Java——交通灯

    

    /*

     * 交通灯管理系统的 项目需求:

     * 模拟实现:  十字路口的交通灯系统逻辑,  具体需求如下:

     *  异步随机生成按照各个路线行驶的车辆。

     *  信号灯忽略黄灯。  只考虑红灯和绿灯。

     *  应考虑在左转车辆控制 信号灯,  右转车辆不受信号灯控制。

     *  具体信号灯控制与生活中普通交通逻辑相同,不考虑特殊情况下的逻辑。

     *  每辆车通过路口时间为1秒,  (可以通过线程sleep模拟)

     *  随机生成车辆时间间隔以及   红绿灯交换时间  间隔自定义   可以设置,

     *  不要求实现 GUI 只考虑  系统里  逻辑实现  可通过 log方式  程序运行结果。

     * 分析:

     *  先考虑  其中出现的对象

     *  灯。。(共有  12种  走向   ;  每一种走向 都要  用一个灯)

     *  路。。

     *  控制系统。。

     */

    public class 交通灯管理的项目

    {

    public static void main(String[] args)

    String[] Roads = new String[]{

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

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

    {

    new Road(Roads[i]);

    }

    new LampController();

    }

    }

    -----------------------------------控制灯的对象--------------------------------

    public class LampController

    {

        private Lamp currentLamp;//当前  的灯

    public LampController()

    {

    currentLamp = Lamp.S2N;//赋值  当前的灯    是 从南——> 北

    currentLamp.light();//让当前的灯 变绿

    /*

     * 制作一个定时器    每个10秒  就去  变红 当前的灯   然后 更换当前的灯

     */

    ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);//线程池

    timer.scheduleAtFixedRate(

    new Runnable()

    {

    @Override

    public void run()

    {

    // TODO Auto-generated method stub

    currentLamp = currentLamp.blackOut();//将  当前的灯  变成  红色

    }

    },

    10,

    10,

        TimeUnit.SECONDS);

    }

    }

     


     -------------------------------------------------------灯------------------------------------------------

    /*

     *    灯  对象

     * 分别   12个  走法    每个  走向 都有一个交通灯

     */

    public enum Lamp

    {

    //12个  走向     对应12个   交通灯  (**单一 对应**)

    S2N("N2S""S2W"false), S2W("N2E""E2W"false), E2W("W2E""E2S"false), E2S("W2N""N2S"false),

    N2S(nullnullfalse), N2E(nullnullfalse), W2E(nullnullfalse), W2N(nullnullfalse),

    S2E(nullnulltrue), E2N(nullnulltrue), N2W(nullnulltrue), W2S(nullnulltrue);

    //枚举中 的构造方法 必须为 私有的

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

    {

    this.opposite = opposite;//对面的灯

    this.next = next;//下一个  灯

    this.lighted = lighted;//给自己  一个初始  值()

    }

    //此条路上的灯(表示自己)

    private boolean lighted;

    //与  词条路  对应的  灯  的名字(对面的 灯)

    private String opposite;

    //下一条   要通行  的 路上 的 灯  的名字

    private String next;

    //提供判断  灯   通过   的方法

    public boolean isLighted()

    {
        return lighted;

    }

        //让 灯 变 红     (表示禁止通过)  然后 返回下一个  变绿  的灯

      public Lamp blackOut()

      {

      //把当前灯 变红    并且把 对面的 灯也要变红

      this.lighted = false;

      if(opposite != null)

      {

      Lamp.valueOf(opposite).blackOut();//把对面的  灯 变红

      System.out.println("-----当前灯--- "+this.opposite+"----**变成   红灯了*****");

      }

     

      Lamp nextLamp = null;//Lamp.valueOf(next);

     

      //把下一个   要通行的  路线 上的 灯  变绿

      if(next != null)

      {

      nextLamp = Lamp.valueOf(next);

     

      System.out.println("oooooo---"+this.next+"-----变成   绿灯oooooo");

      nextLamp.light(); 

      }

      return nextLamp;

      }

     

      //让 灯 变  绿   (可以 通过)

      public void light()

      {

      this.lighted = true;

      //吧对应的   对面的灯  也变绿

      if(opposite != null)

      {

          Lamp.valueOf(opposite).light();

      }

      System.out.println(this.lighted + "   灯亮了  ----   下边  总共有 6  个方向上的 灯 亮了   ");

      }

    }

    -----------------------------------------------路-----------------------------------

    /*

     * 路 对象  

     *  中有 好多车 

     */

    public class Road

    {

    //每条路  都有自己的名字

    private String name;

    //初始化时   就有自己的名字    并且在这条路上  会随机  产生 1000辆车。。

    public Road(String name)

    {

    this.name = name;

    //创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。

    ExecutorService pool = Executors.newSingleThreadExecutor();

    pool.execute(

    new Runnable()

    {

    @Override

    public void run()

    {

    // TODO Auto-generated method stub

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

    {

    try

    {

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

    }

    catch (InterruptedException e)

    {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    car.add(Road.this.name+"_"+i);//往  路上 添加车辆

    }

         }

    });

    //获取一个定时器://参数: 池中所保存的线程数,即使线程是空闲的也包括在内。

    //创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。 

    ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);

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

    //创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,然后在

    //initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。

    timer.scheduleAtFixedRate(

    new Runnable()

    {

    @Override

    public void run()

    {

    // TODO Auto-generated method stub

    //把集合中的  车 给移走。

    if(car.size()>0)

    {

    //内部类  调用  外部类  属性  用 类名.this.属性

    boolean lighted = Lamp.valueOf(Road.this.name).isLighted();//判断   交通灯是否   为绿灯。。

    if(lighted)

    {

        System.out.println(car.remove(0)+"  被移除!!!");

    }

    }

    }

    },

    1,

    1,

    TimeUnit.SECONDS);

    }

        List<String> car = new ArrayList<String>();

    }

     

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    win7下利用VM8安装CentOS6.3配置静态IP上网
    laravel的门面模式
    Redis主从在线互相切换
    phpcmsv9的评论分表策略
    phpcms v9的url优化
    php rsa加密解密实例
    centos 支持中文,安装输入法
    yii2 页面上编写js代码,并注册到页面底部
    yii2 GridView 简要解析
    yii2 migration使用
  • 原文地址:https://www.cnblogs.com/blogs-chao/p/4764915.html
Copyright © 2011-2022 走看看