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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值