BUAA OO Unit2总结

王萌-23373398 2025-04-16 11:03:29

一、第二次作业

一、架构变化

建了主要类,电梯线程,乘客schedular,和处理input的线程,以及处理请求的线程。其中大部分都是在main函数里建的实例,把mainqueue传到其他类里方便统一操作。还有getadvice获取电梯下一步的状态。

二、度量

1、类图

img

三、bug

1、我的bug

1.开始出现cpu超时,原因是一句catch里的内容没有换为e.printStackTrace()而是用了自动补全的。。

四、同步块的设置和锁,调度器

在所有的maintable方法设置了锁,唯一多个线程都需要访问的。

不需要调度。直接把对应乘客分给电梯。电梯用lookstrategy处理请求。

二、第二次作业

一、架构变化

对新增的sche指令,主要改了电梯和subqueue部分,其中还新增了buffer用来把sche时分给电梯的请求传到subqueue里。改了getadvice的判断。

二、度量

1、类图

img

三、bug

1、我的bug

1.在move后面加了判断是不是sche,防止移动超过两层。

2.删除了sche外面没必要的锁,避免sche响应时间太长。

3.把分配策略改了,不判断是否在sche,防止超时,所以需要加一个buffer能防止begin之后receive。

四、同步块的设置和锁,调度器

新增的sche,需要在电梯类的一些方法和subtable方法里加锁,因为会有需求回流。

分配请求的条件:哪个需求少就分给哪个。开始如果在sche就不分配请求,但是这样会导致如果来了好多请求会分给同一个电梯超时,所以把这个条件去掉了。

三、第三次作业

一、架构变化

没怎么改。新增了transfer类连接两个电梯来统一update。在电梯里新增了相关方法。改了getadvice,让电梯只要到了换乘层就执行放人进人然后离开。

二、度量

1、类图

img

三、bug

1、我的bug

中测bug:没有统一begin和end导致b电梯begin后输出receive。
强测:direction计算直接返回原来的没有重新算导致sche之类改变方向的指令之后方向错了会把乘客分给update后不能送他的电梯。

四、同步块的设置和锁,调度器

新增的transfer里的状态需要加锁。

没变,多了对update后的ab电梯能不能进的判断。

五、双轿厢的同步开始改造和运行时两个轿厢不碰撞

transfer类记录进度:ready->begin->finish->end,同步update。

运行时设置occupy,empty记录换乘层的状态,并且move到换乘层后立刻放人进人离开。

四、debug方法

1.中间输出变量,看输出结果,如当前occupy状态。

2.分给电梯请求之前的部分可以调试。

3.看代码逻辑问题,语句处理先后问题。

五、心得体会

线程安全:在所有需要对同一个东西读写交互的方法加上锁,如对mainqueue,或同一个subqueue。如果加多了可能导致运行时间过长。

层次化设计:每个模块应该用清晰划分的职责,并有清晰的接口与其他模块交互,我的代码存在一些某个类与其他类交互过多的问题,这样在多线程中也很容易出现线程不安全的问题,应该减少变量在过多类传递。

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

269

社区成员

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

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