您的位置:首页 > 职场人生

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

2011-09-28 20:21 435 查看
-------------- Android培训 java培训
期待与您交流! --------------

看完张老师编写完程序,发现真的不难,可是自己就是想不到那一点,

才发现编程思想才是最重要的

通过老师的举的面向对象的例子,让自己获益匪浅,似乎自己有一点领悟,让我想到了struts1的FormBean里的validate方法,为什么validate方法定义在Formbean里面,知道现在才发现原来是这么回事,因为就像张老师所说谁拥有数据谁就对外提供操作数据的方法.就拿struts的校验方法,因为Formbean里拥有需要校验的字段,所以在这里定义validate方法在合适不过了,如果定义在别的类就有点麻烦,因为还要从Formbean里得到这些需要校验的字段

通过张老师的分析发现思路才是最重要的,同时还要注意观察生活,这对编程很大的裨益,因为编程的目的就是服务于生活,如果一个程序员对生活都不够了解怎么编写出好的程序呢?所以从现在开始留意生活的点点滴滴 就拿张老师分析的路来说



一开始有点难理解,后来仔细想象还真是那么回事

从这个系统里分析总共有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类;了





在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方法他返回的就是删除的集合元素.因为你删除了它,肯定你要用它.

最后是一个测试类:



首先把12个方向的路的名称初始化,然后启动灯的控制器,整个系统就成了一个整体.

-------------- Android培训 java培训
期待与您交流! --------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: