通过这个项目,我的主要收获有:
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);
}
}