交通灯项目总结

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

package com.isoftstone.interview.traffic;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/*
(一)Road类
  1.每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表方向上的车辆集合。
  2.在Road对象的构造方法中启动一个线程每隔一个随机的时间向vehicles集合中增加一辆车(用一个“路线名_id”形式的字符串进行表示)。
  3.在Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,是则打印车辆集合和将集合中的第一辆车移除掉。*/
public class Road {
 //统计车
 private List <String> vechicles = new ArrayList<String>();
   
 private String name =null;
 public Road(String name)
 {
  this.name = name;//路的名称
  
  //创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行
  
  ExecutorService pool = Executors.newSingleThreadExecutor();
 
//  execute(Runnable command)  在未来某个时间执行给定的命令
        pool.execute(new Runnable(){
        //匿名内部类
   @Override
   public void run() {
    for(int i=1;i<1000;i++)
    {
     try {
      /*public int nextInt(int n):返回一个伪随机数,它是取自此随机数生成器序列的、
      在 0(包括)和指定值(不包括)之间均匀分布的 int 值
      这里表示表示1到10秒里面增加1辆车*/
      Thread.sleep( (new Random().nextInt(10)+1)*1000);
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
     //Road.this.name: 这个name:表示要访问的是成员变量,不能在上面构造方法那里加final
     vechicles.add(Road.this.name+"_"+i);
    }
    
   }} );
  /*定时器  
          1
                         运用Executors  public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
                         创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行 corePoolSize - 池中所保存的线程数,即使线
                         程是空闲的也包括在内。
                        返回:         新创建的安排线程池    unit:度量单位
          2  
                          运行线程池的内容
          ScheduledFuture<?> scheduleAtFixedRate(Runnable command,要执行的任务
                                       long initialDelay,         首次执行的延迟时间
                                       long period,              连续执行之间的周期
                                       TimeUnit unit)       initialDelay 和 period 参数的时间单位                                   
               */
        ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
        timer.scheduleAtFixedRate(
          new Runnable(){
           //匿名内部类,路的 内容
           public void run() {
            if(vechicles.size()>0)//判断路是否有车
            {
             boolean lighted =
               Lamp.valueOf(Lamp.class,Road.this.name).isLingted();//得到路的灯
             if(lighted)//判断是否是绿灯
             {
              System.out.println(vechicles.remove(0)+"is traversing");//最先来的车开走
             }
            }
            
           }
          },
          1,
          1,
          TimeUnit.SECONDS//枚举的秒单位
          );
    
  
 }
}


package com.isoftstone.interview.traffic;

/*(二)Lamp类
  1.系统中有12个方向上的灯,在程序的其他地方要根据灯的名称就可以获得对应的灯的实例对象,综合这些因素,将Lamp类用java5中的枚举形式定义更为简单。
  2.每个Lamp对象中的亮黑状态用lighted变量表示,选用S2N、S2W、E2W、E2N这四个方向上的Lamp对象依次轮询变亮,Lamp对象中还要有一个oppositeLampName变量来表示它们相反方向的灯,再用一个nextLampName变量来表示此灯变亮后的下一个变亮的灯。这三个变量用构造方法的形式进行赋值,因为枚举元素必须在定义之后引用,所以无法再构造方法中彼此相互引用,所以,相反方向和下一个方向的灯用字符串形式表示。
  3.增加让Lamp变亮和变黑的方法:light和blackOut,对于S2N、S2W、E2W、E2N这四个方向上的Lamp对象,这两个方法内部要让相反方向的灯随之变亮和变黑,blackOut方法还要让下一个灯变亮。
*/
public enum Lamp {
 //定义灯,有12条线,则有12个灯
 S2N("N2S","S2W",false),S2W("N2E","W2E",false),W2E("E2W","W2N",false),W2N("E2S","S2N",false),
 N2S(null,null,false),N2E(null,null,false),E2W(null,null,false),E2S(null,null,false),
 S2E(null,null,true),N2W(null,null,true),W2S(null,null,true),E2N(null,null,true) ;
 
 private String oppsite;
 private String next;
 private boolean lighted;
 

 //构造方法
 private Lamp( String oppsite, String next,boolean lighted){
  this.oppsite = oppsite;
  this.next = next;
  this.lighted =lighted;
 }
 //判断是否是绿灯
 public boolean isLingted()
 {
  return lighted;
 }
 //亮灯为绿色,亮灯
 public void light()
 {
  this.lighted = true;
  if(oppsite!=null)//判断第1个参数是否为null
  {
   Lamp.valueOf(oppsite).light();//启Lamp.valueOf(oppsite)对应的灯为亮,为绿
  }
  
 }
 //熄灯,为红灯
 public Lamp black()
 {
  this.lighted = false;
 
  if(oppsite!=null)//判断第1个参数是否为null
  {
   Lamp.valueOf(oppsite).light();//启动对应的灯为红灯
  }
  Lamp nextLamp = null;
  if(next!=null)//判断第2个参数是否为null
  {
   nextLamp = Lamp.valueOf(next);
   nextLamp.light();////让下个灯为绿灯
  }
  return nextLamp;
 }
}


package com.isoftstone.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秒将当前灯变红和将下一个灯变绿。
源码如下:*/
public class LampController {
 
 private Lamp currentlamp;//灯的枚举
 
 public LampController(){
  //初始化 //刚开始让由南向北的灯变绿; 
  currentlamp = Lamp.S2N;
  currentlamp.light();
  
  //定时器,控制灯的转换
  ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
  timer.scheduleAtFixedRate(
    new  Runnable() {
     public void run() {
      currentlamp =  currentlamp.black();
     }
    },
    10,
    10,
    TimeUnit.SECONDS
    );
  
 }

}


package com.isoftstone.interview.traffic;

public class MainClss {

 /**
  * @param args
  *
(四)MainClass类
  1.用for循环创建出代表12条路线的对象。
  2.接着创建出LampController对象。
源码如下:
  */
 public static void main(String[] args) {
  
  String[] directions = new String[]{
   "S2N","S2W","W2E","W2N","N2S","N2E","E2N","E2S","S2E","N2W","W2S","E2N"
  };
  for(int i=0;i<directions.length;i++)
  {
       new Road(directions[i]);//加载12条路
  }
  new LampController();//启动灯的控制器
 

 }

}

 

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值