代码改变世界

OO第二单元总结

2021-04-27 14:49  updragon  阅读(66)  评论(0)    收藏  举报

oo第二单元总结

一、同步块的设置和锁的选择

第二单元采用了“生产者-消费者”模型。同步块主要是对请求队列的相关处理,用synchronized关键字对请求队列加锁,如往请求队列中添加请求、获取请求等。

二、调度器设计

电梯调度算法:采用了扫描算法(SCAN),它让电梯在最底层和最顶层之间连续往返运行,在运行过程中响应处在于电梯运行方向相同的各楼层上的请求。对其进行了一点优化,在没有请求需要处理的情况下等待,不会空转。

在本单元作业中,我没有设计调度器,所以我只能谈一下可能的思路:输入线程和调度器共享一个请求队列,每个电梯都有一个等待队列,由调度器进行分配,电梯只处理自己的等待队列的请求。调度器的分配策略:把请求r1分配给距离该请求最近且运行方向相同的电梯的等待队列。如果该电梯等待队列已满,则比较请求r1与等待队列中请求的出发楼层,如果等待队列中有请求r2出发楼层距离电梯更远,则将请求r2移出,重新加入请求队列,而r1加入电梯的等待队列。当请求队列为空或者所有电梯的等待队列满的时候,调度器线程等待。当输入线程结束或当有请求出电梯的时候,唤醒调度器线程。

三、第三次作业架构和可扩展性

 

四、程序Bug

第一次作业:运行时间超限,Morning 和 Night 模式下,电梯应该及时转向,而不是运行到顶层再转向。

第二次作业:无

第三次作业:电梯转向问题,考虑疏忽

五、发现Bug方法

未发现其他同学的Bug

六、心得体会

通过本单元的学习,了解了多线程的相关知识,掌握了线程间通信、同步、互斥的方法,保证线程安全。