您的位置:首页 > 职场人生

黑马程序员-交通灯管理系统

2012-06-09 12:39 369 查看
---------------------- android培训java培训、期待与您交流! ----------------------

交通灯管理系统:

根据需求画图分析:

1.
总共的路线为12条,除去每个方向向右拐的路线,同时通车的路线为相反方向的两条,这样就将路线分为4组,对这四组路线的交通灯进行控制即可。

2.
因为灯的方向和数量是固定的,所以用一个枚举类来表示它。因项目需求不需要抽象车的对象。将路线和车结合,每条路线中装有车。

3.
写一个交通灯的控制类,对四组灯进行控制。

实现灯的枚举类:

package org.cc.trafficlight;

//使用枚举类模拟交通灯

public enum Lamp {

S2N("S2W", "N2S", false), S2W("E2W", "N2E", false), E2W("E2S", "W2E", false), E2S(

"S2N", "W2N", 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 boolean lighted;

private String next;

private String opposite;

private Lamp() {

}

private Lamp(String next, String opposite, boolean lighted) {

this.next = next;

this.opposite = opposite;

this.lighted = lighted;

}

public boolean isLight() {

return this.lighted;

}

public void light() {// 使交通灯变绿

this.lighted = true;

System.out.println(this.name() + "...可通行");

if (this.opposite != null) {

Lamp.valueOf(this.opposite).lighted = true;

System.out.println(this.opposite + "...可通行");

}

}

public Lamp dark() {// 使交通灯变红并返回下一个灯

this.lighted = false;

if (this.opposite != null) {

Lamp.valueOf(this.opposite).lighted = false;

}

Lamp nextLamp = null;

if (this.next != null) {

nextLamp = Lamp.valueOf(this.next);

}

return nextLamp;

}

}

实现灯控制类:

package org.cc.trafficlight;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

//交通灯控制系统

public class LampControl {

private Lamp current;

public LampControl() {// 初始化

this.current = Lamp.S2N;

current.light();

ScheduledExecutorService time = Executors.newScheduledThreadPool(1);// 设置定时器10改变一次交通灯

time.scheduleWithFixedDelay(new Runnable() {

public void run() {

current = current.dark();

current.light();

}

}, 10, 10, TimeUnit.SECONDS);

}

}

实现路线的类:

package org.cc.trafficlight;

import java.util.ArrayList;

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 Load {

private ArrayList<String> road = new ArrayList<String>();

private String name;

public Load(String name) {

this.name = name;

ExecutorService pool = Executors.newSingleThreadExecutor();// 产生装有一个线程的线程池

pool.execute(new Runnable() {// 1-10秒随机产生一辆车加入到路线中

public void run() {

try {

Thread.sleep((new Random().nextInt(10) + 1) * 1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

for (int i = 1; i < 1000; i++) {

road.add(Load.this.name + "_" + i);

}

}

});

ScheduledExecutorService time = Executors.newScheduledThreadPool(1);// 设置定时器

time.scheduleWithFixedDelay(new Runnable() {// 每秒中查看该路线的交通灯情况,绿灯就将集合中的第一辆车删除

public void run() {

if (road.size() > 0) {

Lamp lamp = Lamp.valueOf(Load.this.name);

if (lamp.isLight()) {

System.out.println(road.remove(0)

+ "...is traversing!!!");

}

}

}

}, 1, 1, TimeUnit.SECONDS);

}

}

测试类:

package org.cc.trafficlight;

public class MainClass {

public static void main(String[] args) {

String[] str = { "S2N", "S2W", "E2W", "E2S", "N2S", "N2E", "W2E",

"W2N", "S2E", "E2N", "N2W", "W2S" };

for (int i = 0; i < str.length; i++) {

new Load(str[i]);

}

new LampControl();

}

}

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

详细请查看:http://edu.csdn.net/heima
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: