交通灯管理系统学习日记

                                                               

                                                                                                             交通灯管理系统学习日记

                                                                        --------------        Android培训          java培训    期待与您交流! --------------

分析:1、每条路线上都会出现多辆车,路线上要随机增加新的车,在灯绿期间还要每秒钟减少一辆车。设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。每条路线上随机增加新的车辆,增加到一个集合中保存。每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。每条路线每隔一秒都会检查控制本路线的灯是否为绿,一个灯由绿变红时,应该将下一个方向的灯变绿。

2、设计一个Lamp类来表示一个交通灯,每个交通灯都维护一个状态:亮(绿)或不亮(红),每个交通灯要有变亮和变黑的方法,并且能返回自己的亮黑状态。总共有12条路线,所以,系统中总共要产生12个交通灯。右拐弯的路线本来不受灯的控制,但是为了让程序采用统一的处理方式,故假设出有四个右拐弯的灯,只是这些灯为常亮状态,即永远不变黑。

3、除了右拐弯方向的其他8条路线的灯,它们是两两成对的,可以归为4组,所以,在编程处理时,只要从这4组中各取出一个灯,对这4个灯依次轮询变亮,与这4个灯方向对应的灯则随之一同变化,因此Lamp类中要有一个变量来记住自己相反方向的灯,在一个Lamp对象的变亮和变黑方法中,将对应方向的灯也变亮和变黑。每个灯变黑时,都伴随者下一个灯的变亮,Lamp类中还用一个变量来记住自己的下一个灯。

4、无论在程序的什么地方去获得某个方向的灯时,每次获得的都是同一个实例对象,所以Lamp类改用枚举来做显然具有很大的方便性,永远都只有代表12个方向的灯的实例对象。设计一个LampController类,它定时让当前的绿灯变红。

从这个系统里分析总共有3个主要的类:

Road Lamp LampController

Road类:

 

在Road类里共有两个线程池第一个线程池往路上添加999辆车

第二个线程池是一个周期性的执行任务,也就是每隔一段时间,执行一次任务

ExecutorService就相当一个线程池,run方法里面的任务是交给整个线程池的,而不仅仅是某一个一个线程

如果任务是任何一次执行遇到了异常,就会取消后续执行,否则只能通过程序来显示取消或终止该任务

      当用完一个线程池后,用该调用该线程池的shutdown方法,该方法将启动线程池的关闭序列,调用shutdown方法后,线程池不会再接受新任务,但会将以前所有已经提交任务执行完成当线程中的所有任务都执行完毕后,池中所有的线程都会死亡,另外通过调用shutdownNow方法来关闭线程池,该方法试图停止所有正在执行的活动任务,暂停正在等待的任务,并返回等待执行的任务列表.

例如:

//实现Runnable接口来定义一个简单的线程类

 

class TestThread implements Runnable
 {
     public void run()
     {
         for (int i = 0; i < 100 ; i++ )
         {
             System.out.println(Thread.currentThread().getName()
                 + "的i值为:" + i);
         }
     }
 }

 public class ThreadPoolTest
 {
     public static void main(String[] args) 
     {
         //创建一个具有固定线程数(6)的线程池
        ExecutorService pool = Executors.newFixedThreadPool(6);
         //向线程池中提交2个线程
        pool.submit(new TestThread());
         pool.submit(new TestThread());
         //关闭线程池
        pool.shutdown();
     }
 }


 

上面的程序中创建Runnable实现类与最大开始创建线程池没有太大的差别,创建Runnable实现类之后并没有直接创建线程,启动线程来执行Runnable任务,而是通过线程池来执行该任务,使用线程池执行该任务,运行结果如下图:

 

 

在Lamp枚举中为什么构造方法里的灯为字符串,因为构造方法里面的灯在下面定义了,所以在前面是无法使用,所以通过实例的名称来定义参数,

至于枚举的构造方法参数的含义只举一个例子:

S2N("N2S", "S2W", false)      N2S表示S2N的对应的灯,S2W表示S2N的下一个灯    如果S2N灯是绿的那么它对应的灯也是绿的

另外枚举的valueOf方法用于把字符串转换成枚举对象

 

System.out.println(name() + " lamp is green 下面总共应该有6个方向能看到汽车通过");为什么是6个方向可以看到汽车通过呢?

一开始觉得奇怪,原来,在路上本来就有4个方向一直是绿的,也就是每个方向的向右拐都是绿的,在加上该方向对应的灯一共有6个方向有汽车通过.

 

本来这个代码片段是这样写的,

  Lamp nextLamp = Lamp.valueOf(next);
  if (next != null) {
     System.out.println("绿灯从" + name() + "------> 切换到了" + next);
   nextLamp.light();
  }
  return nextLamp;

 这样的话就有可能next为null所以按照上面的代码片段写才是安全的,如果一开始就能发现的话,对于我们程序的成功就会大大增加,我们可能不能想张老师那样排错能力那么强,

所以自己总结出来一个规则,如果某个方法需要某个参数,那么这个参数就成了调用该方法的首要条件,首先要考虑这个参数是否存在,或者为null的情况,最好是能够判断一下.如果我们能够防患于未然的话,我们就能避免很多的麻烦了,也增强了程序的健壮性.

首先我们要定义一个当前等绿灯这样一个成员变量,初始化时绿灯为S2N方向

然后在定义一个线程池,周期性的执行任务,每隔10s执行一次,通过Lamp的blackOut方法把等编程红灯,他的返回值为下一个绿灯,然后用当前的绿灯记录这下一个绿灯.

我们还要注意blackOut为什么还要返回下一个绿灯呢?就像List集合的remove方法他返回的就是删除的集合元素.因为你删除了它,肯定你要用它.

 

最后是一个测试类:

 

                                                      --------------        Android培训          java培训    期待与您交流! --------------

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值