BUAA_OO第二单元总结
本单元我只完成了第三次作业。下面只讲第三次作业的内容。
锁与同步块
唯一的共享对象是RequestQueue。主线程将读取到的乘客请求送入RequestQueue中,RequestQueue按照一定规则将其加入到不同类型电梯的待接收请求队列中。每台电梯配有一个控制器。每次电梯向控制器询问下一步操作时,控制器就会访问RequestQueue的对应队列,并将其中请求全部取出,置于控制器内的待处理请求队列中。上述操作中只有主线程对RequestQueue的写入和电梯线程中的控制器对RequestQueue的读取操作需要使用同步块。
调度器设计
简单调度。不设换乘。
电梯种类 | 条件 |
---|---|
C类电梯 | 乘客从1-3层到18-20层或从18-20层到1-3层 |
B类电梯 | 从奇数楼层到奇数楼层 |
A类电梯 | else |
架构设计
UML类图与UML协作图
架构设计
电梯分为6个状态。
0:请求态。电梯向控制器询问下一步操作。若当前控制器还未受到请求则会等待。根据控制器传回的操作码,电梯进行不同的操作。
1:上行。休眠一定时间后电梯所在楼层加一,进入请求态。
2:下行。类似。
3:等待。只有在morning模式下才有意义。等待2s,然后根据控制器的等待信号决定是否继续等待。
4:开门。休眠0.2s后电梯开门,除去电梯中所有目标楼层为当前层的乘客。若当前层有乘客要乘梯,则使其全部进入。
5:关门。休眠0.2s后电梯关门。进入请求态。
控制器根据当前电梯的楼层、乘客人数、到达模式决定电梯的下一步操作。
若有人到达了目标楼层,或电梯未满时当前层有乘客需要乘梯,且其行动方向与主请求一致,则使电梯开门。
若主请求不在电梯中,则电梯开往主请求所在楼层。
若主请求在电梯中,则电梯开往主请求目标楼层。
BUG分析
找到了一个bug。在设定主请求的时候,由于没有理清所有可能的情况,发生了空指针的问题。
HACK策略
未曾hack。
心得体会
现在回看这个单元,其实并不难。只要理解了java多线程的机制,和各个线程控制方法的效果及用法就可以轻松完成。但可惜的是上课时讲得浮光掠影,课下我又没有及时查找相关资料,致使我未能顺利完成前两次作业。随着这几个星期不断地加深对多线程的理解,以及两次实验课的上手操作,我才突然发现我错在了哪。之后就顺水推舟完成了第次作业。面对新问题时不要急于下手,要先深刻理解问题的场景和各个部分的行为逻辑才能精准下药。