对于交通灯系统的学习

来源:互联网 发布:mac ndk环境变量配置 编辑:程序博客网 时间:2024/05/22 05:24

通过这个项目,我的主要收获有:

1.对于Executors定时器的应用

2.对于面向对象编程的思想有更深入的理解

3.了解了需求分析--代码编写的过程。

    我觉得听过之后,虽然有了认识,但是自己再做一遍能更加深记忆。同时能在实践过程中,发现问题,解决问题。

下面是我自己实践的过程:

首先分析需求,可以借助画图,这有助于更好的理解。

然后,类的设计:

灯,Lamp枚举,封装了12个红绿灯及其的改变方式。

路线,Road类,封装增加删除车辆的方法,其中增加构造器中实现(线程,避免难产),删除在定时器中实现

交通灯控制器,LampControler,一个定时器,每隔一段时间改变红绿灯。

 其中对于定时器的实现之前没有接触,所以我赶紧借助API学习了下。

实现Lamp 交通灯方向要借助于画图,否则很容易搞混。其中右拐设置为常绿,其余8个可以两个为一组(状态一致),分别为【N2S,S2N】,【E2W,W2E】,【W2N,E2S】,【S2W,N2E】.

理清了思路之后,发现整个程序的运行就是3个线程,一个增加车辆(在构造器中实现),一个减少车辆(定时器,并且要判断方向灯是否亮了),一个负责交通灯的转换。

    根据上述思路,我编写好了代码。但并不是很顺利,遇到了些问题。

1.哪里要进行同步?由于是road操作车辆,LampControler操作Lamp的切换,并没有共享数据,所以不用担心多线程的安全问题。

2.车辆放行时,未进行判断灯是否亮了?这个判断将两个线程连接起来,要加Lamp.valueOf(Road.this.name).isLighted()这个判断,满足条件才可以放行。

3.随机上路时未增加随机数?Thread.sleep((new Random.nextInt(10)+1)*1000)

4.枚举的构造器不能加public修饰符。

5.Lamp.valueOf()方法需要判断,因为有可能传进去的参数错误。

6. 还有关于面向对象的新认识,像“小球从绳子的一端到另一端”这个例子让我印象深刻,将其纪录下来备忘。

class Rope{private int startPoint;private int enndPoint;public Rope(int startPoint ,int endPoint){this.startPoint = startPoint;this.enndPoint = endPoint;}public int nextPoint(){//谁拥有数据,谁就提供操作数据的方法return new Random().nextInt();}}class Ball{private Rope rope;private int currentPoint;public Ball(Rope rope,int currentPoint){this.rope = rope;this.currentPoint = currentPoint;}public void move(){currentPoint = rope.nextPoint();System.out.println("小球移动到了"+currentPoint);}}