/*

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

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


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


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


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


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


每辆车通过路口时间为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(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 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>();

}

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

Java——交通灯的更多相关文章

  1. java交通灯管理系统项目

    交通灯管理系统   模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆. 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- ...

  2. Java交通灯系统

    交通灯管理项目模拟了对十字路口交通灯的控制,一般在我们生活中的十字路口是有人行道的,而此项目没有考虑人行道.具体需求如下:  1.异步随机生成按照各个路线行驶的车辆.          例如:     ...

  3. 黑马程序员——【Java高新技术】——案例:交通灯管理系统

    ---------- android培训.java培训.期待与您交流! ---------- 一.交通灯管理系统的项目需求 Ø 异步随机生成按照各个路线行驶的车辆 例如: 由南向而来去往北向的车辆 - ...

  4. 黑马程序员:Java编程_7K面试题之交通灯管理系统

    =========== ASP.Net+Android+IOS开发..Net培训.期待与您交流!=========== 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行 ...

  5. java 7K交通灯管理系统面试题

    交通灯管理系统 模拟实现十字路口的交通灯管理系统逻辑.详细需求例如以下: 1. 异常随机生成依照各个路线行驶的车辆.    比如:    由南向而来去往北向的车辆----直行车辆    由西向而来去往 ...

  6. Java基础---Java---面试题---交通灯管理系统(面向对象、枚举)

    交通灯管理系统的项目需求: 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 1.异步随机生成按照各个路线行驶的车辆  例如:   由南向而来去往北向的车辆-----直行车辆   由西向而来去往南 ...

  7. Java高级——交通灯管理系统

    本方法模拟了现实生活中的交通信号灯的情况 1.先构建Road类,此类可以创建12个方向的路 代码如下: package com.springtie.traffic; import java.util. ...

  8. java 面试题之交通灯管理系统

    需求: 交通灯管理系统的项目需求 Ø 异步随机生成按照各个路线行驶的车辆. 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 由东向而来去往南向的车辆 ...

  9. 黑马程序员_JAVA之交通灯管理系统

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1.一.需求:模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:  1.异步随机生成按照各个路 ...

随机推荐

  1. C++指针详解(二)

    指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一.利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯:指针能 ...

  2. vs2012 .netFramwork2.0发布到xp

    开发环境 windows server2008R2 VS2012  .net Framwork2.0 开发的winform程序 在有的xp系统下不能运行 选择 项目属性=>编译 Build=&g ...

  3. 团队博客——Sprint计划会议1

    每日Scrum:第一天 会议时间:4.14.晚八点半 会议地点:基础教学楼一楼大厅 小组成员:郭庆樑,林彦汝,张金 认领人—使团队成员分工合作,保持团队的积极性. ID 名称(NAME) 重要性(IM ...

  4. Html.ActionLink , Url.Action

    也来总结一下 以后省的忘了 都是从controller中获取到action名字返回 html.actionlink 返回的是带<a> 标签的超链接 url.action 是返回正常cont ...

  5. 从对SAE的一次授权安全评估浅谈云安全

      EMail: jianxin#80sec.comSite: http://www.80sec.comDate: 2011-12-20From: http://www.80sec.com/ [ 目录 ...

  6. (转)mysql账号权限密码设置方法

    原文:http://www.greensoftcode.net/techntxt/2013410134247568042483 mysql账号权限密码设置方法 我的mysql安装在c:\mysql 一 ...

  7. IOS创建目录接口createDirectoryAtPath:withIntermediateDirectories:中参数attributes的设置

    在应用程序执行时,经常需要本地化保存一些重要的数据,这时就有可能需要创建一些目录.Objective-C提供了一个非常强大的创建目录的接口: - (BOOL)createDirectoryAtPath ...

  8. Python变量与常量

    变量是计算机内存中的一块区域,变量可以存储规定范围内的值,而且值可以改变.基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中.常量是一块只读的内存区域,常量一旦被初始化就不能被 ...

  9. git pull --rebase 做了什么? 以及 Cannot rebase: You have unstaged changes 解决办法

    最近刚学 git rebase,觉得很牛逼的样子, 结果今天就被打脸了. git pull --rebase 报错: Cannot rebase: You have unstaged changes ...

  10. C#指针转换

    下表显示了预定义的隐式指针转换. 隐式转换可能在多种情形下发生,包括调用方法时和在赋值语句中. 隐式指针转换       From To 任何指针类型 void* null 任何指针类型 显式指针转换 ...