OO第二单元总结

第五次作业

总体设计

类设计

第五次作业要求为模拟一部电梯运行,由于只有一部电梯,故没有采用调度器的设计,类图如下图所示:

  • WaitQueue类定义了电梯等待队列的功能,其实例化对象为共享对象。

  • PersonList类对电梯内的请求进行了封装,实现电梯内人员变动的模拟。

  • Elevator类模拟电梯的运行,电梯的状态由楼层和变量state决定。

线程设计

设置了两个线程InputThread输入线程和Elevator线程,使用waitQueue作为共享对象进行进程间交互,在每次使用waitQueue时使用synchronized加锁,同时使用wait-notifyAll进行进程间的交互,各线程的作用为:

  • InputThread线程作用为接受输入的请求并将请求加入WaitQueue

  • Elevator线程作用为处理WaitQueue中的请求并模拟电梯的运行

电梯运行策略设计

电梯的运行策略采用ElevatorPattern接口,于Elevator类中实现,本次作业电梯运行策略的设计为

  • Morning模式,电梯会在1层进行较长时间的开门后等待(在其他楼层开门后等待时间极短),然后把进入电梯的乘客运送完毕后再回到一楼进行载客。

  • Random模式,电梯首先将WaitQueue当前最前的请求视为主请求,在主请求进入电梯后电梯只会捎带在主请求楼层区间内的请求,主请求运送结束后,电梯将WaitQueue当前最前的请求作为下一个主请求,直到运送完所有请求。

  • Night模式,此次作业中和Random模式相同。

bug分析

这次作业仅通过了中测,强测几乎全部没过,并失去了互测的资格,原因是Random模式电梯的运行效率太低,电梯的性能达不到要求,经过思考,修改了电梯的Random模式和Night模式:

  • Random模式,电梯在无人的时候,将会选择离电梯当前所在楼层最近的请求视为主请求,并在主请求进入电梯后由主请求确定电梯运行的方向,电梯可以捎带同方向上所有的请求,直到电梯为空(该方向上的请求都被处理完毕),然后电梯重新选择主请求。

  • Night模式,电梯会将楼层最高的请求视为主请求,之后,捎带主请求区间内的所有请求(电梯满载时不作捎带)。电梯回到1层后重新选择主请求。

第六次作业

总体设计

类设计

第六次作业模拟多部电梯的运行,类图如下所示:

线程设计

设计了InputThread,ElevatorAdder,Scheduler线程,并且每部电梯为一个线程,各个线程作用为:

  • Inputthread线程将接收到的乘客请求加入到totalWaitQueue中,将增加电梯请求加入到elevatorRequests中。

  • ElevatorAdder线程处理elevatorRequests中的请求,添加新的电梯线程和电梯等待队列elevatorQueue。

  • Schduler线程将totalWaitQueue中的请求分配到各个电梯的电梯等待队列elevatorQueue中。

  • Elevator线程处理各自waitQueue中的请求,并模拟电梯的运行

调度器设计

调度器采用依次分配的调度策略,使用一个counter变量代表请求的序号,将totalWaitQueue中序号为n的请求分配给第n%m部电梯的请求队列(m为电梯的当前部数)。从而实现了请求的调度。

bug分析

这次作业的调度器的设计存在问题,当请求到来会分配给对应的电梯,之后便交给电梯处理该请求,而不是分配给空闲的电梯,并且,当请求到来后再添加电梯,新电梯将无法处理之前已到来的请求,这是由于没有设计重分配的机制。这个问题导致性能的损失,从而强测的有一个点没过。

第七次作业

总体设计

此次作业的架构设计与第六次作业一致,仅修改了调度器的调度策略。

调度器设计

第七次作业将电梯分为ABC三类,不难发现A类电梯停靠楼层最多限乘人数最多,但楼层间移动速度最慢,B类电梯停靠楼层和限乘人数次之,楼层间移动速度稍快,C类电梯停靠楼层最少,限乘人数最少,楼层间移动速度最快,此次作业没有实现换乘机制,调度器调度策略为,当请求到来时确定分配给的电梯,若请求的楼层满足C类电梯,则优先分配给C类电梯。若请求的楼层满足B类电梯而不满足C类电梯,则分配给B类电梯,最后剩下的请求分配给A类电梯。

UML协作图

如下图所示:

bug分析

由于没有实现换乘的策略,在互测中被一个精心构造的数据hack了,该数据的请求全为只满足A类电梯的请求且请求的楼层区间恰为最大值(20层到4层),于是导致BC类电梯完全用不上,最后性能达不到要求。

心得体会

总的来说,这三次作业设计得太过于简单,出现了很多性能上达不到要求的问题。不过,在此之中,我对多线程编程有了粗浅的认识,初步理解了线程之间的同步的实现和共享对象的一些简单应用。对线程的安全问题也有了一定的理解。这几次作业写得太过于粗糙,希望自己在未来几次作业中多加努力,努力提高自己面向对象编程的能力。

posted @ 2021-04-27 21:17  OUZHUOJIAN  阅读(65)  评论(0编辑  收藏  举报