OO Unit2 总结

蒋槟阳-22373437 学生 2024-04-20 12:33:14

代码结构分析

第一次

本次作业中主要由以下几个类构成

img


其中 Elevator 为电梯的线程,Strategy 为用于决策电梯行为的类,InputThread 为用于输入的类
UML 图如下

img

第二次

本次作业中,我对代码进行了重构,形成了新的架构
作业中有以下类

img


其中 Direct 为表示 Elevator 行为的一个枚举,Elevator 为单个电梯的对象,ElevatorThread 为控制电梯对向的线程,Strategy 为用于决策电梯行为的类,InputThread 为用于输入的类,WaitingRequest 为表示单个电梯的等待队列的类,WholeWaitingRequest 为分配请求的类
UML 图如下

img

第三次

本次作业大体延续第二次作业的架构,但为了解决双轿厢问题做了一定的调整
作业中有如下类

img


其中 Direct 为表示 Elevator 行为的一个枚举,Elevator 为单个电梯的对象,ElevatorThread 为控制电梯对向的线程,Strategy 为用于决策电梯行为的类,InputThread 为用于输入的类,WaitingRequest 为表示单个电梯的等待队列的类,Arranger 为分配请求的类,Occupied 为解决双轿厢电梯在同一层的类,Shaft 为用于管理双轿厢电梯中两个电梯的类,RequestBuffer 为请求的缓存类
UML图如下

img


线程协作图入戏

img

总体上 Elevator 类 ,ElevatorThread 类,Strategy 类,InputThread 类,WatingRequest 类,Arranger/WholeWaitingRequest 类,RequestBuffer 是比较稳定的,这一部分这是电梯的基础,所有的电梯活动均基于他们而行。其他类用于处理不同的电梯类型的相关问题,比如 Occupied 和 Shaft 是用于解决双轿厢电梯的问题而设计的类。
在整个 Unit 的中,由于我没有很好的考虑扩展性的问题,所以对架构进行调成,对代码重构,但在第二次作业后就确定的架构其核心代码可以较稳定的延续。

同步与锁

在本 Unit 中,我使用的均为 synchronized 锁,通过不让多个线程访问同一对象的方法来解决多线程之间同步的问题。其中一个运用为使用同步锁完成 Occupied 类,使得
可以完成一个线程完全的 Occupied 类,此时通过使用 Occupied 类可以保证双轿厢电梯不会相撞。
此外电梯是同时被电梯线程和输入线程控制的,需要使用同步锁以保证电梯信息的正确性。

Bug 与 Debug 方法

在本地 Unit 中遇到的 bug 大多数都是关于同步锁的 bug,由于没有较好的设计锁的使用导致死锁的 bug。
对于死锁的问题,又分为可以复现的情况和不能复现的情况。
对于可以复现的情况,我采取将程序中间打印信息的方法来观察是哪一个部分死锁了,找到了死锁的位置之后再对原因分析并改良。
对于难以复现的情况,这种情况我并没有找到一个很好的方法来解决问题,只能通过对所有锁的结构和位置进行分析,考虑为什么会出现死锁的问题。
整体来说死锁的问题没有很好的 debug 手段,只能尽量在设计的时候考虑仔细,以求完成代码之时就没有问题或较少问题。

心得体会

本次 Unit 中主要的问题是多线程的问题,为保证多线程的线程安全会使用锁的结构,但此时又会产生死锁的问题,所以为思维和设计的缜密提出了很高的要求,也让我了解到了多线程程序设计的困难之处。层次化多线程设计中的一种思路,通过层次化的设计,可以方便思考多线程中容易出现的各种问题,让我学习到了如何去设计一个多线程的程序。整个 Unit 使我从零基础到对多线程设计有了一定的了解和认知,虽仍不能很好写出优秀的多线程程序,但是也有了了解,能够逐步完成多线程程序设计

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

301

社区成员

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

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