java交通灯管理项目
交通灯管理需求:
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
• 异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆---- 直行车辆
由西向而来去往南向的车辆---- 右转车辆
由东向而来去往南向的车辆---- 左转车辆
。。。
• 信号灯忽略黄灯,只考虑红灯和绿灯。
• 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
• 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
• 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
• 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
• 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
需求分析:
主要是面向对象的分析,分析一共有多少个对象.谁占有资源谁就提供方法.张老师还在其中讲了不少面向对象的分析,很实用.
首先需要有路: Road
package com.isoftstone.interview.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;
/**
* 每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
* 每条路线上随机增加新的车辆,增加到一个集合中保存。
* 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
* @author 张孝祥 www.it315.org
*
*/
public class Road {
//路线名称和交通灯名称是一致的
private List<String> vechicles = new ArrayList<String>();
private String name =null;
public Road(String name){
this.name = name;
//模拟车辆不断随机上路的过程
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable(){
public void run(){
for(int i=1;i<1000;i++){
try {
Thread.sleep((new Random().nextInt(10) + 1) * 1000);//1-9秒内不断的增加车辆
} catch (InterruptedException e) {
e.printStackTrace();
}
vechicles.add(Road.this.name + "_" + i);
}
}
});
//每隔一秒检查对应的灯是否为绿,是则放行一辆车
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
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 !");//输出车辆里面包含了路线名称和i变量;
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
//利用12个方向的路线来判定该路灯是否为亮,如果灯亮那么就输出,否则就继续增加车辆并等待(线程继续循环)。
交通灯枚举类Lamp
package com.isoftstone.interview.traffic;
/**
* 每个Lamp元素代表一个方向上的灯,总共有12个方向,所有总共有12个Lamp元素。
* 有如下一些方向上的灯,每两个形成一组,一组灯同时变绿或变红,所以,
* 程序代码只需要控制每组灯中的一个灯即可:
* s2n,n2s
* s2w,n2e
* e2w,w2e
* e2s,w2n
* s2e,n2w
* e2n,w2s
* 上面最后两行的灯是虚拟的,由于从南向东和从西向北、以及它们的对应方向不受红绿灯的控制,
* 所以,可以假想它们总是绿灯。
* @author 张孝祥 www.it315.org
*
*/
/**/
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.opposite = opposite;
this.next = next;
this.lighted = lighted;
}
/*当前灯是否为绿*/
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;
}
}
控制器类LampController
package com.isoftstone.interview.traffic;
public class MainClass {
public static void main(String[] args) {
//产生12个方向的路线
String [] directions = new String[]{
"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"
};
for(int i=0;i<directions.length;i++){
new Road(directions[i]);
}
//产生整个交通灯系统
new LampController();
}
}
利用控制器类来生成12条路。然后将车放入其中,再调用start方法。
分享到:
相关推荐
在本项目"Java实战项目--个人资产管理系统"中,我们主要关注的是利用Java技术栈构建一个客户端/服务器(C/S)架构的应用程序,用于管理个人财务和资产。这个系统提供了登录、注册以及搜索查询等核心功能,旨在帮助...
基于AVA后台资金管理系统设计与实现 本文档对基于AVA后台资金管理系统的设计与实现进行了详细的介绍。该系统基于BS架构模式开发,采用Java开发,MySQL作为数据库,旨在为广大民众提供后台资金管理服务。该系统的...
Java窗体学生管理系统是一款基于Java编程语言开发的桌面应用程序,旨在提供一个简洁、直观的界面,用于管理和操作学生的信息。这个系统通常会包含一系列功能,如添加学生信息、查询学生信息、修改信息以及删除学生...
本文将详细介绍如何使用和管理这个"AVA体验服启动文件夹",以便让玩家能够顺利地在体验服中畅玩游戏。 首先,我们要明白“AVA体验服启动文件夹”是游戏客户端的一部分,它包含了运行体验服所需的一系列核心文件和...
《AVA v2.2:深度学习中的动作识别与数据集详解》 在人工智能领域,特别是计算机视觉和机器学习,动作识别是一项重要的研究课题。而AVA(A Video Dataset for Human Action Recognition)v2.2,是由Google Research...
AVA数据集json标签文件ava.json测试标签数据80种类,google研究AVA人类行为数据集的标签文件
ava物资管理系统项目是一种基于Java语言开发的软件系统,用于帮助企业或组织管理和跟踪物资的采购和消耗。该系统具有多种功能,包括物资采购管理、库存管理、物资申领审批等,旨在提高物资管理的效率和准确性。 ...
这篇内容将深入探讨AVA的特性、使用方法以及如何将其集成到您的项目中。 **1. 什么是AVA?** AVA,全称Asynchronous Value-Asserting,是由Sindre Sorhus创建的一个开源项目,主要目标是提供一个现代化的...
中庆与AVA对比表中庆与AVA对比表中庆与AVA对比表中庆与AVA对比表中庆与AVA对比表
- **Maven或Gradle**:构建工具,用于管理项目依赖,自动化构建过程。 - **HTML/CSS/JavaScript**:前端页面的构建基础,用于创建用户友好的界面。 - **Ajax**:用于实现页面的异步更新,提高用户体验。 - **JSTL/EL...
《AVA数据集:深入探索人类动作理解》 AVA(Action Genome)数据集是谷歌公司推出的一个庞大而精细的视频数据库,旨在推动计算机视觉领域中人类行为的理解与分析。这一数据集的发布,对于人工智能,尤其是视频理解...
虹光ava5扫描仪驱动程序是一款可以有效解决虹光ava5扫描仪在使用过程中出现的一些问题的驱动工具,本站提供了虹光ava5扫描仪驱动下载地址,有需要的朋友们就来下载使用吧。 虹光ava5是一款平板式扫描仪,采用的是...
ava编辑器学习版本ava编辑器学习版本ava编辑器学习版本ava编辑器学习版本ava编辑器学习版本
软件集成了详尽的教程资源、实例解析、实战项目以及互动式练习,打造了一站式的ava学习环境。 首先,该软件提供的ava基础教程涵盖了语法基础、数据类型、控制结构、类与对象等核心概念,让初学者能够系统地了解ava...
**Ava_Find硬盘搜索工具详解** Ava_Find是一款高效实用的硬盘搜索软件,专为用户设计,用于快速、精准地在计算机硬盘上查找所需的文件或数据。它的主要功能是帮助用户在海量的文件中迅速定位目标,从而提高工作效率...
Ryujinx.Ava.exe
【标题】"J2SE项目_雇员管理系统_源码" 涉及的主要知识点是Java SE(Java标准版)的编程技术,尤其是构建一个基于Java的雇员管理系统。这样的项目通常涵盖了许多基础到进阶的Java编程概念,是初学者巩固理论知识并...
图像美学质量评价数据集AVA下载链接,可用迅雷下载!文件30G左右较大,建议在网速良好的状态下下载。
Ava Find Professional 1.5 一个用来搜索本地硬盘文件的工具。专业版。
10. **项目管理和版本控制**:运用项目管理工具如Git进行版本控制,协同团队成员共同开发。 通过这个课程设计,学生不仅会掌握Java编程技能,还会了解到电子商务系统的运作原理,以及如何利用技术提高电商平台的...