本方法模拟了现实生活中的交通信号灯的情况

1.先构建Road类,此类可以创建12个方向的路

代码如下:

 package com.springtie.traffic;

 import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; public class Road {
// 12个方向的路名
private String roadname;
// 存储车辆的集合
private List<String> vehicle = new ArrayList<String>(); // 根据每个方向的不同创建不同的路名
public Road(String roadname) {
this.roadname = roadname;
// 向当前路添加1000辆车
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable() {
public void run() {
try {
Thread.sleep((new Random().nextInt(10) + 1) * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int car = 0; car < 1000; car++) {
// 把车辆添加进来
vehicle.add(roadname + "方向的车辆" + car);
// System.out.println(roadname+"方向的车辆"+car+"正在开过来");
}
}
});
// 当前路上的,灯位绿色的,使其最前面的车辆1秒后穿越马路,再过一秒后上来的最前面车辆穿越马路,如此循环,知道灯变红
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable() {
public void run() {
if (!vehicle.isEmpty()) {
boolean lampState = Lamp.valueOf(roadname).isLighted();
if (lampState) { System.out.println(vehicle.remove(0) + "穿越马路");
}
}
}
}, 1, 1, TimeUnit.SECONDS);
}
}

2.创建交通灯枚举Lamp,通过私有构造函数传入当前灯的对应灯和下一个灯以及当前的状态

代码如下:

 package com.springtie.traffic;

 public enum Lamp {
// 12个信号灯枚举对象
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 String oppositeLamp;
private String nextLamp;
private boolean lampState; // 私有构造函数
private Lamp(String oppositeLamp, String nextLamp, boolean lampState) {
this.oppositeLamp = oppositeLamp;
this.nextLamp = nextLamp;
this.lampState = lampState;
} // 判断是红灯还是绿灯
public boolean isLighted() {
return lampState;
} // 让灯变绿,对应灯也变绿
public void turnGreen() {
this.lampState = true;
if (oppositeLamp != null) {
Lamp.valueOf(oppositeLamp).turnGreen();
}
System.out.println("灯:" + this.name() + "为绿灯,+对应等和其他四个灯也为绿灯");
} // 让灯和对应灯变红,同时让下一个灯变绿,返回下一个灯
public Lamp turnRed() {
this.lampState = false;
if (oppositeLamp != null) {
Lamp.valueOf(oppositeLamp).turnRed();
}
Lamp next = null;
if (nextLamp != null) {
next = Lamp.valueOf(nextLamp);
System.out.println("绿灯:" + this.name() + " 切换为:" + next.name());
next.turnGreen();
}
return next;
}
}

3.创建灯控系统类LampController,利用此类来控制灯变量的顺序

代码如下:

 package com.springtie.traffic;

 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.turnGreen();
// 单开一个线程,当前灯变红的同时下个等变绿,一直重复
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable() {
public void run() {
System.out.println("当前灯变红时,返回下个灯并让其变绿");
currentLamp = currentLamp.turnRed();
}
}, 10, 10, TimeUnit.SECONDS);
}
}

4.创建一个主类(MainClass)来测试

代码如下:

 package com.springtie.traffic;

 public class MainClass {

     public static void main(String[] args) {
// 代表12条路的方向
String[] directionRoadName = new String[] { "S2N", "S2W", "E2W", "E2S",
"N2S", "N2E", "W2E", "W2N", "S2E", "E2N", "N2W", "W2S" };
// 把12条路的线程启动
for (int i = 0; i < directionRoadName.length; i++) {
new Road(directionRoadName[i]);
}
// 调用灯控系统
new LampController();
} }

至此,一个完整的模拟现实生活中的交通灯管理系统构建完毕。

Java高级——交通灯管理系统的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 黑马程序员_7K月薪面试题之_交通灯管理系统

    ----------- android培训.java培训.java学习型技术博客.期待与您交流! --------- 1,交通灯管理系统的项目需求 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: ...

  9. 黑马程序员_java基础笔记(14)...交通灯管理系统_编码思路及代码

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 1,面试题——交通灯管理系统 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: ...

随机推荐

  1. Domain=NSOSStatusErrorDomain Code=1937337955 关于iOS录音AVAudioRecorder与音频播放AVAudioPlayer真机调试录音不能播放的问题

    error:Domain=NSOSStatusErrorDomain Code=1937337955 ,这个错误很常见, 原因是因为我们需要调用另外一个AVAudioPlayer 的初始化方法,来确定 ...

  2. 【技术累积】【点】【java】【6】时间戳

    闲聊 加班多诶,写博客诶. 基本 时间戳,直观理解就是时间上面盖个戳罢了,在时间这个轴上面记录个点: unix时间戳表示从开始的时间点开始,经过了多少秒: 可以简单的看做是一个计时器: 基本定义可以直 ...

  3. parent() parents() parentsUntil()三者之间的对比

    $(document).ready(function(){ $("span").parent(); });只拿到span的父级标签 $(document).ready(functi ...

  4. noip 2010 引水入城 贪心 + 搜索

    不难分析出如果有解则每个蓄水厂所能覆盖到的干旱城市一定是连续的.否则,中间那些没被覆盖的部分永远都不能被覆盖到. 当然,每个蓄水厂所覆盖的城市有可能不连续,不过既然有解,则一定都是连续的.我们可以开一 ...

  5. C++进阶 STL(1) 第一天 [容器,算法,迭代器] string容器 vector容器 deque容器

    课程大纲 02实现基本原理 容器,算法,迭代器 教室:容器 人:元素 教室对于楼:容器 序列式容器: 容器元素在容器中的位置是由进入容器的时间和地点来决定 序列式容器 关联式容器: 教室中 按年龄排座 ...

  6. [NoiPlus2016]换教室

    flag++ //Writer : Hsz %WJMZBMR%tourist%hzwer #include <iostream> #include <cstdio> #incl ...

  7. .net 技术基础

    C#常见运算符 一元运算符(+.-.!.~.++.--) 算术运算符(*./.%.+ . – ) 移位运算符(<< .>> ) 关系和类型测试运算符(==.!=.<.&g ...

  8. 02.OOP面向对象-3.一些理解

    对封装的理解? 封装,类本身就是一个封装,封装了属性和方法.方法也是封装,对一些业务逻辑的封装.私有也是封装,将一些方法和属性私有化,对外提供可访问的接口. 对继承的理解 将共性的内容放在父类中,子类 ...

  9. Problem 9

    Problem 9 # Problem_9.py """ A Pythagorean triplet is a set of three natural numbers, ...

  10. 数据库连接池dataesoruce pool深入理解

    8.数据库连接池的connection都是长连接的,以方便多次调用,多人连续使用.dataSourcePool9.数据库连接池中的连接,是在你用完之后,返回给数据库连接池的,并不是close()掉,而 ...