首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

黑马软件工程师_java 交通灯管理系统

2013-03-28 
黑马程序员_java 交通灯管理系统??? ??? ??? ??? ??? }??? ??? ??? ??? }})??? ??? ??? //每隔一秒检查对

黑马程序员_java 交通灯管理系统
??? ??? ??? ??? ??? }
??? ??? ??? ??? }});
??? ??? ??? //每隔一秒检查对应的灯是否为绿,是则放行一辆车
??? ??? ??? ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
??? ??? ??? timer.scheduleAtFixedRate(new Runnable() {
??? ??? ??? ??? @Override
??? ??? ??? ??? public void run() {
??? ??? ??? ??? ??? //检查路上是否有车
??? ??? ??? ??? ??? if(vehicle.size() > 0)
??? ??? ??? ??? ??? {
??? ??? ??? ??? ??? ??? boolean lighted =
??? ??? ??? ??? ??? ??? Lamp.valueOf(Road.this.name).isLighted();
??? ??? ??? ??? ??? ??? if(lighted)
??? ??? ??? ??? ??? ??? ??? System.out.println(vehicle.remove(0) +
??? ??? ??? ??? ??? ??? ??? "is traversing !");
??? ??? ??? ??? ??? }
??? ??? ??? ??? }
??? ??? ??? },
??? ??? ??? 1,??? ??? //指定过多长时间去执行run()
??? ??? ??? 1,??? ??? //执行完以后,再过多场时间继续执行run()
??? ??? ??? TimeUnit.SECONDS);??? ??? //说明前面数字的度量单位
??? ??? }
??? }
??? package com.itheima.interview.traffic;

??? /**
??? ?* 分析:
??? ?*??? 1:系统中有12个方向上的灯,在程序的其他地方要根据灯的名称就可以获得对应的灯的实例
??? ??? ?? 对象,综合这些因素,将Lamp类用java5中的枚举形式定义更为简单。
??? ?*??? 2:每个Lamp对象中的红、绿状态用lighted变量表示,选用S2N、S2W、E2W、E2N这四个方向上
??? ?*??? ?? 的Lamp对象依次轮询变亮,Lamp对象中还要有一个opposite变量来表示它们相反方向的灯,
??? ?*??? ?? 再用一个next变量来表示此灯变绿后的下一个变绿的灯。这三个变量用构造方法的形式进
??? ?*??? ?? 行赋值,因为枚举元素必须在定义之后引用,所以无法再构造方法中彼此相互引用,所以,
??? ?*??? ?? 相反方向和下一个方向的灯用字符串形式表示。
??? ?*??? 3:增加让Lamp变绿和变红的方法:getGreen和getRed,对于S2N、S2W、E2W、E2N这四个方向上
??? ?*??? ?? 的Lamp对象,这两个方法内部要让相反方向的灯随之变绿和变红,getRed方法还要让下一个
??? ?*??? ?? 灯变绿。
??? ?*??? 4:除了S2N、S2W、E2W、E2N这四个方向上的Lamp对象之外,其他方向上的Lamp对象的
??? ?*??? ?? next和opposite属性设置为null即可,并且S2N、S2W、E2W、E2N这四个
??? ?*??? ?? 方向上的Lamp对象的next和opposite属性必须设置为null,以便防止
??? ?*??? ?? getGreen和getRed进入死循环。
??? ?*
??? ?* @author xiedong
??? ?*
??? ?*/
??? public enum Lamp {
??? ??? /*每个枚举值各表示灯控制的一个方向*/
??? ??? S2N("N2S", "S2W", false), S2W("N2E", "E2W", false),
??? ??? E2W("W2E", "E2S", false),E2S("W2N", "N2S", 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 Lamp(){}
??? ??? private boolean lighted;
??? ??? private String opposite;
??? ??? private String next;
??? ??? /*判断灯的状态*/
??? ??? public boolean isLighted()
??? ??? {
??? ??? ??? return lighted;
??? ??? }
??? ??? /*灯变绿的方法*/
??? ??? public void getGreen()
??? ??? {
??? ??? ??? this.lighted = true;
??? ??? ??? if(opposite != null)
??? ??? ??? ??? Lamp.valueOf(opposite).getGreen();
??? ??? ??? System.out.println(name() + "lamp is green,
??? ??? ??? 下面总共应该有6个方向能看到汽车通过");
??? ??? }
??? ??? /*灯变红的方法*/
??? ??? public Lamp getRed()
??? ??? {
??? ??? ??? this.lighted = false;
??? ??? ??? if(opposite != null)
??? ??? ??? ??? Lamp.valueOf(opposite).getRed();
??? ??? ??? Lamp nextLamp = null;
??? ??? ??? if(next != null){
??? ??? ??? ??? nextLamp = Lamp.valueOf(next);
??? ??? ??? ??? System.out.println("绿灯从" + name() + "-------->切换到:" + next);
??? ??? ??? ??? nextLamp.getGreen();
??? ??? ??? }
??? ??? ??? return nextLamp;
??? ??? }
??? }
??? package com.itheima.interview.traffic;

??? import java.util.concurrent.Executors;
??? import java.util.concurrent.ScheduledExecutorService;
??? import java.util.concurrent.TimeUnit;

??? /**
??? ?* LampController类
??? ?* 分析:
??? ?*??? 1:整个系统中只能有一套交通灯控制系统,所以,LampController类最好是设计成单例。
??? ?*??? 2:LampController构造方法中要设定第一个为绿的灯。
??? ?*??? 3:LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10秒
??? ?*??? ?? 将当前灯变红和将下一个灯变绿。
??? ?* @author xiedong
??? ?*
??? ?*/
??? public class LampController {
??? ??? private Lamp currentLamp;
??? ??? public LampController()
??? ??? {
??? ??? ??? //刚开始让由南向北的灯变绿;
??? ??? ??? currentLamp = Lamp.S2N;
??? ??? ??? currentLamp.getGreen();
??? ??? ??? /*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/???
??? ??? ??? ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
??? ??? ??? timer.scheduleAtFixedRate(new Runnable() {
??? ??? ??? ???
??? ??? ??? ??? @Override
??? ??? ??? ??? public void run() {
??? ??? ??? ??? ??? currentLamp = currentLamp.getRed();
??? ??? ??? ??? ???
??? ??? ??? ??? }
??? ??? ??? }, 10, 10, TimeUnit.SECONDS);
??? ??? }
??? }
??? package com.itheima.interview.traffic;
??? /**
??? ?* 这是一个测试类
??? ?* @author xiedong
??? ?*
??? ?*/
??? public class MainApp {
??? ??? public static void main(String[] args) {
??? ??? ??? String[] directionArr =
??? ??? ??? ??? ?? {"S2N", "S2W", "E2W", "E2S",
??? ??? ??? ??? ??? "N2S", "N2E", "W2E", "W2N",
??? ??? ??? ??? ??? "S2E", "E2N", "N2W", "W2S",};
??? ??? ??? for(String item : directionArr)
??? ??? ??? ??? new Road(item);
??? ??? ??? new LampController();
??? ??? }
??? }
------- android培训、java培训、期待与您交流! ----------

热点排行