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

来源:互联网 发布:js click target 编辑:程序博客网 时间:2024/04/30 08:18

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

一、需求

二、画图演示
三、分析
  • 大体过程:线路随机增加车,且本线路灯为绿,车通行。所以关键对象就是线路和灯。
  • 线路:
    • 线路的作用是:产生车辆、判断灯、移除车辆。
    • 数量:共12条,12个线路对象。
    • 每条线路随机增加新车辆,装入集合
    • 线路每秒检查灯,是绿灯,头一辆车通过,移出集合。
    • package com.isoftstone.interview.traffic;import java.util.List;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 Road{//存储这条路线车辆的集合private List<String> vehicles=new ArrayList<String>();private String name =null;public Road( String name){this.name = name;//下面开启一个线程,功能是:1-10秒出现一辆车,接着添加进集合。ExecutorService pool = Executors.newSingleThreadExecutor();pool.execute(new Runnable(){@Overridepublic void run(){// TODO Auto-generated method stubfor (int i = 0; i < 1000; i++){try{Thread.sleep((new Random().nextInt(10)+1)*1000);} catch (InterruptedException e){// TODO Auto-generated catch blocke.printStackTrace();}vehicles.add(Road.this.name+"_"+i);//访问外部类的成员变量:外部类名.this.变量名}}});//下面定义一个调度线程,固定频率,移除集合中的首辆车,返回:路名+编号ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable(){@Overridepublic void run(){// TODO Auto-generated method stub//Lamp lamp = Lamp.valueOf(direction);if(vehicles.size()>0){//这条路上的灯是否是亮的。boolean lighted = Lamp.valueOf(Road.this.name).isLighted();if (lighted)//有车,绿灯,则通行{System.out.println(vehicles.remove(0)+"is traversing!");}}}}, 1, 1, TimeUnit.SECONDS);}}

  • 灯:
    • 灯的作用是:当前状态、变红、变绿。
    • 数量:12个灯,
      • 有4个(右转)是长亮的。
      • 其他8条是成对存在的,灯的颜色变化相同。
      • 综上,不同的只有4组灯。只要控制好这四组灯即可。
    • 控制: 怎么控制四组灯,依次轮转变亮呢?
      • 自己与对面的灯一块变化,需要一个变量记住。
      • 记住自己后面的灯,也需要一个变量。尾巴记住首位组成一个循环。
      • 由于灯的实例每个方向只有一个,用枚举可以带来很大的方便,永远都只有代表12个方向的灯的实例对象。
    • package com.isoftstone.interview.traffic;public enum Lamp{//只有第一行四个灯是重要的,南向上、向左。东向上、向左。只要控制好这四个灯的循环,所有灯就被控制了。//第一行第一个参数给String,可以转成Lamp。直接Lamp类型不行,因为作为参数的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.opposite = opposite;this.next = next;this.lighted = lighted;}private boolean lighted;//灯的状态,true为红,false为暗private String opposite;//对面的灯。类型为String可以恢复为Lamp,private String next;//下一个灯。public boolean isLighted() //灯是否亮?{return lighted;}public void light()//变绿方法{this.lighted = true;if(opposite != null)//对面的灯为null,不能有对应的灯接着回来找我了,不让会死循环{Lamp.valueOf(opposite).light();//对面也跟着变绿}System.out.println(name()+"lamp is green,下面共应该有6个方向能看到汽车通过!");}public Lamp blackOut()//变红方法。{this.lighted = false;if(opposite != null)//对面的灯为null,不能有对应的灯接着回来找我了,不让会死循环{Lamp.valueOf(opposite).blackOut();//对面也跟着变红}//当前灯灭,则把下一个灯变亮作为当前灯,返回。//Lamp nextLamp = Lamp.valueOf(next);Lamp nextLamp = null;if(next != null){nextLamp = Lamp.valueOf(next);//Lamp.valueOf(next).light();System.out.println("绿灯从"+name()+"---->切换为"+next);nextLamp.light();}return nextLamp;}}

  • 灯控制器类
    • 这个类主要是控制灯的颜色变化。
    • 每过10秒钟就改变当前灯的颜色,灯的变红方法应该返回下一个灯,接着下一个灯作为当前灯。
    • 定时让当前的绿灯变红。
    • package com.isoftstone.interview.traffic;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class LampController{private Lamp currentLamp;public LampController(){//初始化灯并且为绿(亮light)currentLamp = Lamp.S2N;currentLamp.light();//建一个定时器,每过一段时间,让当前的灯变红,下一个灯变绿。ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable(){public void run(){//当前灯变红,返回值为下一个灯,下一个灯作为当前的灯。System.out.println("来啊");currentLamp = currentLamp.blackOut();}}, 10, 10, TimeUnit.SECONDS);}}

  • MainClass
    • main()所在。
    • 创建12条路线。
    • 创建灯控制器对象,定时器可以放在构造函数,对象建立任务执行。
    • package com.isoftstone.interview.traffic;public class MainClass{/** * @param args */public static void main(String[] args){//创建12条路线对象,和1个控制器。/*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);*/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();}}

 

原创粉丝点击