黑马程序员学习笔记九——交通灯管理系统

----------------------android培训java培训、期待与您交流! ----------------------

交通灯管理系统

首先简单思考下,该怎么创建对象。

先画一个图,有助于分析,一切不可空想。


总共有12条路线,假设每个路口都有一个红绿灯控制,那么有四条路线就可以假设为常绿状态。另外八个可以先看成两组 s2n s2w ,e2w e2s .那么同样分别对应一组。

下一步设想红绿灯系统,汽车,路线。 

黄灯可以忽略不计。

汽车需要看到自己前面对应灯是不是绿灯,还要看到前面是否有车。所以这里要建立路的集合,并且添加增加减少车辆的方法。

在每条路线上如果是绿灯每秒钟要减少一辆车,并且每秒钟都会检查本路线是否绿灯,如果绿灯变红那么下路线就变绿。

开始编程:

 关于路(road)的编写。每条路线上都有一个路线名字并且有个车辆集合。现实生活中车辆时随机来的,所以这里集合车辆也是随机增加的。另外需要一个定时器,检查是否绿灯,如果绿灯就减少集合车辆。

关于灯的编写:12个灯,有四个是默认的路灯,其他每个灯有变亮变黑方法。

另外就是 控制灯的编写,因为只有一套控制系统,所以通过前面的知识用单例比较合适,在单例上推荐饿汉式

开始 编码:

1. Road

import java.util.*;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

public class Road {

//定义车辆集合 

private List<String> carList=new ArrayList<String>();

 

// 定义路线构造函数,因路线很多所以初始值为null;

private String name =null;

public Road(/*final*/String name){

this.name=name;

//定义线程池 产生车辆

//创建线程池

ExecutorService pool=Executors.newSingleThreadExecutor();

//给线程池分配任务 定义Runnable 实现对象

pool.execute(new Runnable(){

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 上产生  某个方向(Name) 上产生的的几辆车

//这是一个内部类,内部类访问外部类局部变量需要加final

//vechicles.add(name+"----------"+i);

//如富哦不加final  访问外部类成员变量 是 外部类名字 .this.name 如下

carList.add(Road.this.name+"---------------");

}

}

});

//建立定时器。

ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);

//连环爆破

timer.scheduleAtFixedRate(

new Runnable(){

//把集合的第一辆车移走

public void run(){

//检查是否有车

if(carList.size()>0){

//假如灯是绿的

boolean lighted=

//Lamp.valueOf(Road.this.name).isLighted();

Lamp.valueOf(Road.this.name).isLighted();

if(lighted==true){

System.out.println(

carList.remove(0)

+"is Traning"

);

}

}

}

},

//过多少秒干这事

1,

//上件事干完后在过多少秒 接着干

1, 

//说明上面数字度量单位

TimeUnit.SECONDS);

}  

}

2. 灯  lamp

注意 :有十二条路线的灯 这里用的枚举

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 oppsite,String next,boolean lighted){

this.oppsite=oppsite;

this.next=next;

this.lighted=lighted;

}

//为了让上面定义的 路线不报错,向程序提供一个无参构造方法

private Lamp(){}

//定义绿灯

private boolean lighted;

// 定义对应的灯 

 private String oppsite;

 //定义下一个灯

 private String next;

//是否变绿

boolean isLighted(){

return lighted;

}

// 提供变绿的方法 ,同事对应灯也变绿

public void light(){

this.lighted=true;

/**

 * 这里不能直接写oppisite.lighted();  

 * 会让程序陷入死循环、

 */

if(oppsite!=null){

 //返回名字对应的枚举对象,再掉用light方法

Lamp.valueOf(oppsite).light();

}

//调试信息 某方向的灯是绿的

System.out.println(name()+"lamp is green  下面有六个方向能看到汽车穿过");

}

//让灯变黑

public Lamp blackOut(){

this.lighted=false;

//让对应灯也变黑

if(oppsite!=null){

Lamp.valueOf(oppsite).blackOut();

}

Lamp nextLamp=null;

//假如有下一个灯,就让他变黑

if(oppsite!=null){

nextLamp=Lamp.valueOf(oppsite);

System.out.println("绿灯从"+name()+"------切换为"+oppsite);

nextLamp.light();

}

return nextLamp;

}

}

3. 灯的控制器

import java.util.concurrent.*;

import com.isoftstone.interview.traffic.Lamp;

public class LampController {

//定义当前灯 

 private Lamp currLamp;

 //构造函数 让某一个灯变为绿色

 public LampController(){

 currLamp =Lamp.S2N;

 currLamp.light();

 //创建定时器 控制灯 

ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(

new Runnable(){

public void run(){

//使当前灯变黑

currLamp=currLamp.blackOut();

}

},

10,

10,

TimeUnit.SECONDS);

 }  

}

4. 建主函数窗口

public class MainClass {

/**

 * @param args

 */

public static void main(String[] args) {

// 新建十二条路线 由于路线太多,可以用数组装进去

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

}

}

----------------------android培训java培训、期待与您交流! ----------------------


详细请查看: <a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值