oo2024 Unit2总结

张金涛-22373311 学生 2024-04-20 15:20:42

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

锁的选择:只使用了synchronized关键词的锁。

同步块设置:给waitQueue类所有方法都加上了synchronized关键词。

在elevator类中涉及到遍历和修改waitQueue的语句块都添加了synchronized关键字。

二.调度器设计

本单元作业在设计调度器方面,没有单独设置schedule类。将调度融合在了InputThread类中。

调度器如何与线程交互:获得请求后直接分配给电梯线程。

调度策略:调度电梯时按请求输入的顺序给1-6号电梯依次分配。

如何适应性能指标:未做提升性能的板块。

一.架构模式

Elevator类:电梯线程。实现运载人

WaitQueue类:请求队列类。实现将InputThread类调度好的队列分发给电梯。

InputThread类:输入队列并进行调度。

MainClass类:主要负责主线程启动。

此外还通过Motion枚举了电梯的不同状态:包括:wait,over,reset,move,open,reverse.

一.架构变化和UML类图

架构没有变化。只有方法新增。

UML类图及其协作:

 

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

稳定的内容:请求的接受和存储、电梯类的运行,

  • 单个电梯的运输策略,在hw5中确定后保持不变
  • Schedule调度的实现:都是根据不同电梯对当前请求cost值的比较来选择分配电梯

易变的内容:新增的请求、新增的不同种电梯、乘客分配方法、策略类

  • 线程结束的条件:hw5中输入完毕即可结束。hw6中由于电梯重置还需重新调度,不能在输入完毕后直接结束Schedule线程。hw7中双轿厢电梯的结束,一个电梯不能在没有乘客时立即结束,需要等待两个电梯都没有乘客时才能结束。

三.如何实现双轿厢的两个轿厢不碰撞

在其中一部电梯到达换乘层之前检查另一部电梯是否在换乘层。

即在两个DcLift中维护一个共享对象,当一个电梯即将抵达换乘层时,检查该共享对象的值;
如果标记位为当前没有电梯即将抵达或抵达换乘层,则进入;
如果有电梯已经占据了换乘层,则阻塞当前进程,直到另外一个电梯离开该层。

四.程序bug与debug

前两次作业通过较为顺利。

但第三次作业出现下列bug导致未通过。

1.轮询。 针对轮询, 可以采用print输出调试信息, 在每一个可能出现轮询的循环中加入调试信息的输出从而判断问题的产生。

2.死锁。通过在纸上画图理清锁的顺序。

本人也经常使用DPO OJ v2网站进行代码评测。非常好用。

五.心得体会

1.线程安全方面:

其实引起线程不安全最根本的原因 就是 :线程对于共享数据的更改会引起程序结果错误。线程安全的解决策略就是:保护共享数据在多线程的情况下,保持正确的取值。我们要灵活运用三种实现线程安全的方法:互斥同步,非阻塞同步,无同步方案。只有深入理解了多线程程序的原子性,可见性和有序性三个特点才能避免低级错误。

2.层次化设计方面:

一个好的调用层次可以极大地减少线程安全问题发生的可能性。比如一个线性、单向的调用链几乎不可能发生死锁。例如可以输入线程请求队列后进入调度线程。在电梯队列和缓冲队列中进入电梯线程。处理完毕后返回输入线程。

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

301

社区成员

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

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