OO Unit 2 总结

杨柳- 学生 2024-04-20 13:00:25

面向对象程序设计第一单元总结、

作业中同步块的设置和锁的选择,锁与同步块中处理语句之间的关系

总的来说,我在三次作业中使用的都是synchronized锁,大多都是在方法层面上加锁,然后锁大多都是在PersonQueue里面,因为都是在处理需求;

架构的变化

HW5

UML图

img

架构设计

首先是在 Main 里面开启所有线程,包括电梯线程,输入线程和分配线程;

因为第五次的作业要求很简单,指定了乘客需要搭乘的电梯,所以在分配Schedule类在此次作业可有可无,可以直接在input线程里面就把相应的乘客需求分配给对应的电梯,在Input结束的时候,为每一个电梯需求队列打上 End 标记;

接下来就是电梯的运作了,在我的电梯里面都有自己的属性,各自的需求队列processQueue,同时创建一个策略类Strategy实例作为电梯的一个属性,这样向strategy传入电梯的各项参数,然后返回电梯下一步应该做什么,但是不处理具体的属性改变,比如它可以读到电梯takePerson现在有多少人,电梯现在的楼层nowFloor,如果电梯有人在nowFloor下,那么就会返回Open,然后在外面的电梯线程接受到Open就会执行操作,改变其相应参数。

同时在策略类有两点需要注意,第一是电梯的停止Over,在第五次作业由于每一个电梯的都确定了处理队列,只需要其处理队列为空 Null 且 到了 End,那么电梯就可以停止了;第二是Main的寻找和处理,我在作业里面采用的是Long策略,首先如果电梯没人且Main为空,我就会在处理队列ProcessQueue里面先按当前方向找目的地离现在楼层最远的需求,找不到就反向寻找,都找不到就 Wait,找到了记得判断电梯是否需要 Turn 转向(很重要,不要让电梯走到最高楼层自己转向,这样会在后面出现Bug);

HW6

UML图

img

架构设计

在第六次作业中,有两个改动,第一是乘客不在分配到指定的电梯,在乘客配分配到相应电梯的时候输出 Receive,第二是有新的reset指令可以更改电梯参数,此时电梯不能投入使用;

面对不分配给指定的电梯,这次作业分配类Schedule就必不可少了,这样总的就是 Input线程把需求给到一个中间的盘子 WaitQueue里面,然后 Schedule线程把需求拿走然后分配到每一个电梯的 ProcessQueue里面,这是总体的架构思路;

面对reset指令,我的处理是reset之后把电梯的所有需求放回 WaitQueue里面,注意放回的乘客 From楼层改变,同时改变电梯的一个 noRun属性,这样在Schedule线程分配时不会向这个电梯分配需求;

HW7

UML图

img

架构设计

在第七次作业中新添加 DCreset指令,可以把电梯变为双轿厢电梯,我的架构上没有太大改变,不过在 main里面一开始就启动了 12部电梯线程,在没有接受到 DCreset指令之前,后面 6部电梯都不会运作,并且在 DCreset之后前面 6部电梯变为 A电梯,后面 6部电梯变为 B电梯,设置 MinFloor和 MaxFloor,在其间运行;

协作图

img

调度策略

在第二次作业之中,为调度的优先级做出了排列,但是不可能考虑到所有的情况,首先优先给空的电梯分配乘客,其次优先把顺路的乘客分配给电梯,在最后按照顺序分配;但是这样会出现其他电梯reset然后剩下的少数电梯接待全部任务的情况,于是我加了一个停止方法,当reset电梯过多时停止调度,但其实因为电梯搭乘人数的限制,在一开始的分配是不可能做到完美的;
于是在第三次作业中索性全部放弃,就按顺序分配,只需要能够运送乘客的电梯就可以 Receive这个乘客;

三次作业稳定和易变的内容

稳定内容

总体的架构设计,如调度,电梯运行等基本设计都是没有变化的;

不稳定内容

电梯的种类等是不稳定的;

双轿厢的两个轿厢不碰撞

在双轿厢问题上,我的电梯策略strategy会判断电梯的下一步是不是前往 TransFloor,如果是的话,电梯下一步执行的就是 DCmove而不是 move,在 DCmove之中,我设置了一个代码块锁,锁的对象是电梯 id对应的换乘楼层 TransFloor,在里面会执行进入楼层,开门,出去或上来,关门,离开楼层的动作,保证进入楼层后不会停留,如果两部电梯同时要执行 DCmove,就会争夺这一把锁,得到锁的电梯会执行这些操作;

Bug分析及debug方法

第五次作业中没有很多Bug,只有一点是Strategy策略类里面,电梯在没人的时候优先去接里电梯最远的人,但是没有判断电梯人到底满没满,比如在2-11被设为main的时候,因为一楼上了6个1-3的人,到了2楼就被卡住了,因为人满了main上不去,但是在Strategy里面main还在,就一直返回Open;

第六次作业中,有reset指令后执行顺序的问题,如应该在 RESET_BEGIN之后再把电梯的人放回到 WaitQueue,不然其他电梯就会先接人,还有就是结束的问题,电梯的结束应该判断 WaitQueue是否为空,否则在最后执行 Reset指令后,WaitQueue的乘客由于所有电梯都结束于是无法分派;

第七次作业中也是顺序问题;

最后debug的方法我就是简单的输出,然后去修改相应错误;

心得体会

通过这个单元的学习,对多线程的了解更多了,原先我一无所知,这也是第一次接触到多线程的代码;回到正题,在线程安全方面,在都对共享对象进行操作时应该加锁保证同时只有一个线程会对其造成改变,并且要学会找到那个共享对象;层次化设计方面,应该就是按照需求设计,有线程的开启,线程的运作两层;

...全文
27 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

301

社区成员

发帖
与我相关
我的任务
社区描述
2023年北航面向对象设计与构造
学习 高校
社区管理员
  • YannaZhang
  • CajZella
  • C_ecelia
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧