交通灯控制系统
2016-06-09 10:36
351 查看
交通信号灯
分析:信号灯Lamp类 :
四个方向 12条路线被12个信号灯控制(忽略黄灯)红灯停绿灯行
"S2N","N2S","S2W","N2E","E2W","W2E","E2S","W2N",
每两个一组,一组灯同时变绿或变红,程序代码只需要控制每组灯中的一个灯即可
"S2E","N2W","E2N","W2S"
后两行的灯是虚拟的,由于从南向东和从西向北以及它们的对应方向不受红绿灯的控制
枚举 变量lighted opposite 方法 light ;breakOut
-------------------------------------------------------------------------------------------------------------------
信号灯控制LampController类
初始由南到北的交通灯为绿 10s后转换为红 下一个方向opposite变绿
变量currentLamp 调用Executors类
-------------------------------------------------------------------------------------------------------------------
道路类Road
每一个Road实例(对象)代表一个路线 共需12个road对象
每条路线上随机产生车辆 车辆放入集合中保存
每条路线每秒检查一次该路线是否为绿灯,是则移除集合中第一辆汽车
变量 LIstanbul<>vechicles ;name
//模拟车辆不断随机上路的过程
//每隔一秒检查对应的灯是否为绿,是则放行一辆车
-------------------------------------------------------------------------------------------------------------------
主类Main
12条路线放入一个集合 for(){批量创建}
调用信号灯控制类
new LampController();
-------------------------------------------------------------------------------------------------------------------
package testtraffic;
/**
*
* @author guoshuai
*/
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.lighted = lighted;
this.opposite = opposite;
this.next = next;
}
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;
}
}
//***************************************************************************************************************
package testtraffic;
import java.util.Timer;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
*LampConraller 信号控制灯
* currentLamp当前灯
* @author guoshuai
*/
public class LampController {
//构造器设初值 S2N为绿 亮
private Lamp currentLamp;
public LampController(){
currentLamp=Lamp.S2N;
currentLamp.light();
/*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/
ScheduledExecutorService Timer=Executors.newScheduledThreadPool(1);
Timer.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
currentLamp=currentLamp.blackOut();
}
},
2,
2,
TimeUnit.SECONDS);
}
}
//***************************************************************************************************************************
package testtraffic;
/**
*创建12个交通路线
* 开启交通灯管理
* @author guoshuai
*/
public class MainClass {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
String []a=new String[]{"S2N","S2W","E2W",
"E2S","N2S","N2E","W2E",
"W2N","S2E","E2N","N2W","W2S"};
//批量创建12条路线
for (int i = 0; i < a.length; i++) {
new Road(a[i]);
}
//启用信号灯系统
new LampController();
}
}
//*******************************************************************************************************************************************************88
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
*把路看成一个集合 放置产生的汽车 一秒通过一辆 当该路段交通灯为绿灯时 汽车-1
* 总共12条路线 每条路线随机产生车辆 每条路每1秒判断一次(是否为绿线)
* @author guoshuai
*/
public class Road {
private List<Object> vechicles =new ArrayList<Object>();
private String name;
public Road(String name){
this.name=name;
//在构造器生产汽车
ScheduledExecutorService ThreadPool=Executors.newScheduledThreadPool(1);
ThreadPool.execute(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
try {
Thread.sleep((new Random().nextInt(10)+1)*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
vechicles.add(Road.this.name+"_"+i);
}
}
});
//每隔一秒检查是否为绿灯 是则放行一辆车
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable() {
@Override
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 !");}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
分析:信号灯Lamp类 :
四个方向 12条路线被12个信号灯控制(忽略黄灯)红灯停绿灯行
"S2N","N2S","S2W","N2E","E2W","W2E","E2S","W2N",
每两个一组,一组灯同时变绿或变红,程序代码只需要控制每组灯中的一个灯即可
"S2E","N2W","E2N","W2S"
后两行的灯是虚拟的,由于从南向东和从西向北以及它们的对应方向不受红绿灯的控制
枚举 变量lighted opposite 方法 light ;breakOut
-------------------------------------------------------------------------------------------------------------------
信号灯控制LampController类
初始由南到北的交通灯为绿 10s后转换为红 下一个方向opposite变绿
变量currentLamp 调用Executors类
-------------------------------------------------------------------------------------------------------------------
道路类Road
每一个Road实例(对象)代表一个路线 共需12个road对象
每条路线上随机产生车辆 车辆放入集合中保存
每条路线每秒检查一次该路线是否为绿灯,是则移除集合中第一辆汽车
变量 LIstanbul<>vechicles ;name
//模拟车辆不断随机上路的过程
//每隔一秒检查对应的灯是否为绿,是则放行一辆车
-------------------------------------------------------------------------------------------------------------------
主类Main
12条路线放入一个集合 for(){批量创建}
调用信号灯控制类
new LampController();
-------------------------------------------------------------------------------------------------------------------
package testtraffic;
/**
*
* @author guoshuai
*/
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.lighted = lighted;
this.opposite = opposite;
this.next = next;
}
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;
}
}
//***************************************************************************************************************
package testtraffic;
import java.util.Timer;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
*LampConraller 信号控制灯
* currentLamp当前灯
* @author guoshuai
*/
public class LampController {
//构造器设初值 S2N为绿 亮
private Lamp currentLamp;
public LampController(){
currentLamp=Lamp.S2N;
currentLamp.light();
/*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/
ScheduledExecutorService Timer=Executors.newScheduledThreadPool(1);
Timer.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
currentLamp=currentLamp.blackOut();
}
},
2,
2,
TimeUnit.SECONDS);
}
}
//***************************************************************************************************************************
package testtraffic;
/**
*创建12个交通路线
* 开启交通灯管理
* @author guoshuai
*/
public class MainClass {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
String []a=new String[]{"S2N","S2W","E2W",
"E2S","N2S","N2E","W2E",
"W2N","S2E","E2N","N2W","W2S"};
//批量创建12条路线
for (int i = 0; i < a.length; i++) {
new Road(a[i]);
}
//启用信号灯系统
new LampController();
}
}
//*******************************************************************************************************************************************************88
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
*把路看成一个集合 放置产生的汽车 一秒通过一辆 当该路段交通灯为绿灯时 汽车-1
* 总共12条路线 每条路线随机产生车辆 每条路每1秒判断一次(是否为绿线)
* @author guoshuai
*/
public class Road {
private List<Object> vechicles =new ArrayList<Object>();
private String name;
public Road(String name){
this.name=name;
//在构造器生产汽车
ScheduledExecutorService ThreadPool=Executors.newScheduledThreadPool(1);
ThreadPool.execute(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
try {
Thread.sleep((new Random().nextInt(10)+1)*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
vechicles.add(Road.this.name+"_"+i);
}
}
});
//每隔一秒检查是否为绿灯 是则放行一辆车
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable() {
@Override
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 !");}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
相关文章推荐
- 主线程就防止在子线程操作UI
- maven打包时无法识别lombok中@Data生成的get set方法
- Android studio 中SlidingMenu的使用
- Android系统横竖屏切换时候Activity的生命周期
- 2016年读过&实践过的技术书籍
- 团队二阶段冲刺个人工作总结7
- 不是人人都懂的学习要点
- 【Android框架】Android-universal-image-loader源码阅读(一)
- 博客发在oschina
- 《剑指offer》-第一个只出现一次的字符位置
- nexus搭建maven私服
- POJ 3667 Hotel
- 找规律___zxa and set(hdu 5680 BestCoder Round #83)
- C实现复制文件
- 项目感言--功能的模块化
- Notification简单实例
- 机器学习中会用到的矩阵、向量求导公式
- 需求评审五个维度框架分析及其带来的启示-5-结束语
- JS实现星星评分功能实例代码(两种方法)
- js Map