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

}

 

    原文作者:小菜马
    原文地址: https://blog.csdn.net/yangchao13341408947/article/details/37499817
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞