BUAA OO UNIT 2总结

蔡威-23060106 2024-04-20 15:24:50

 

一、第五次作业

1. 题目分析

要求模拟一个多线程实时电梯系统,本系统需将乘客从起始层送至终点层,期间涉及上下移动、开关门、乘客进出电梯等操作;本次作业指定电梯,不涉及调度策略。

2. 架构设计

本单元作业中生产者-消费者模式贯穿于我的架构设计。一个简单的生产者-消费者模型包含生产者、消费者和缓冲区三个部分:生产者线程负责生产数据,并将数据放入缓冲区;消费者线程将数据从缓冲区中取出,并进行处理;缓冲区则对生产者和消费者的数据处理能力起到一个平衡作用,达到缓存和解耦合的目的。在本次设计中生产者为Input线程,线程输入数据存入缓冲区RequestQueue中,并传给Sheduler和Elevator进行处理。

3. 代码分析

  • Input:输入线程,调用官方包输入,接收请求,将请求加入缓冲区。

  • Sheduler:调度器线程,为电梯分配请求;本次输入指定电梯,直接按照指定电梯ID进行分配。

  • Elevator:电梯线程,在run()方法中通过switch case语句设置电梯运行模式,再设置相应的moving()、opening()、closing()方法规范电梯运行。

  • RequestQueue:请求队列,输入数据的缓冲区。调度器线程与电梯线程共享请求队列,为保证线程安全,将其中所有方法均上锁,并在addRequest、getOneAndRemove、setEnd、isEmpty、isEnd方法中添加notifyAll语句,用来唤醒等待中的线程。

4. UML类图

 

 

二、 第六次作业

1. 题目分析

增加需求:

  1. 调度器设计:取消指定电梯分配,提出调度需求

  2. RESET指令:重置速度和荷载。

  3. RECEIVE输出约束:在电梯接收调度后增加RECEIVE输出,直接导致自由竞争策略失效

2. 代码分析

基本沿用第五次作业的架构,在各类中都进行了必要的调整:

  • Input:区分PersonRequest和ResetRequest,加入queue中

  • Sheduler:重写调度策略,增加调度方法,最终选择随机分配

  • Elevator:增加reset()方法和isReset()判断,重写电梯状态方法,在执行相关操作时首先进行判断,如果isReset则在waiting时执行reset操作,其他状态下只有不满足isReset才执行相应操作

3. UML类图

 

 

 

三、 第七次作业

1. 题目分析

增加需求:双轿厢电梯重置,其中包含换乘楼层,AB轿厢不能同时处于换乘楼层。

2. 代码分析

  • 如何重置为双轿厢:电梯类新增doubleReset方法,新增电梯线程和transFloor变量。

  • 怎样才能不相撞:用lock方法加锁,同时使用synchronized同步块保证同一时间只能有一个线程获取锁,判断电梯是否在换乘楼层并设置状态,保证同一时间只能有一个轿厢在换乘层。

3. UML协作图

 

四、 心得体会

线程安全:在涉及多线程时,共享资源需上锁以避免不同线程同时访问产生竞争,一般考虑两种方法,即synchronized关键字和读写锁;上锁后需notifyAll(),避免死锁。

层次化设计:在设计复杂系统时可将其细分为不同模块,每个模块实现一个核心功能,具体体现在这次电梯设计上即根据功能区分线程,形成输入->调度->运行的流水线结构,层次较分明。

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

301

社区成员

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

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