OO第二单元总结——多线程电梯
第五次作业分析
1.设计策略
调度器采用单例模式,内部设请求队列,对请求队列的一切操作(查、增、删)都在调度器内完成,且都要求串行,从而确保线程安全。接收器和电梯是两个线程:接收器接受请求调用调度器来存入请求队列,接受器关闭时通知调度器;电梯调用调度器来获得请求,电梯从调度获得空请求且查询到接受器关闭时停止运行。
2.度量分析
(1)复杂度矩阵
方法复杂度:
类复杂度:

由于这一次作业是简单的单电梯傻瓜调度,所以方法和类复杂度都比较低。
(2)类图
(3)协作图

3.bug分析
没有bug。
第六次作业分析
1.设计策略
与上次作业相比,本次作业仅仅增加了捎带,故整体策略不变,仅改变电梯调度的算法为扫描算法且增加捎带功能。
由于在调度器,我们只关注乘客的出发楼层和目标方向,而在电梯内,只关注乘客的目标楼层。所以可以将调度器中的请求队列分割为上行请求队列和下行请求队列以及乘客目标楼层图,在电梯内新增楼层到达图:
上行请求队列:每一层有哪些乘客要上行;
下行请求队列:每一层有哪些乘客要下行;
乘客目标楼层图:每一位乘客要在哪一层出电梯;
楼层到达图:每一层有哪些乘客要出电梯。
实现捎带:
电梯到达每一层时向调度器发送捎带请求,调度器将对应方向请求队列中该层的乘客的目标楼层图返回给电梯,电梯捎带这些乘客,将他们加入对应楼层到达图对应楼层的乘客列表。
实现扫描算法:
电梯属性中新增方向和目标楼层。
电梯中没有乘客(当前楼层为目标楼层),选择主请求(新的目标楼层)时:
①选择方向与电梯当前方向一致,且出发楼层在电梯当前楼层的当前方向上的最近请求,若存在这种请求:
若该请求在当前楼层,则将该乘客目标楼层设为电梯目标楼层;
否则将该请求出发楼层作为电梯目标楼层。
②若不存在①中那种请求,则选择方向与电梯当前方向相反,但出发楼层在电梯当前楼层的当前方向上的最远请求,若存在这种请求,将电梯方向取反:
若该请求在当前楼层,则将该乘客目标楼层设为电梯目标楼层;
否则将该请求出发楼层作为电梯目标楼层。
③若不存在②中那种请求,则选择方向与电梯当前方向相反,且出发楼层在电梯当前楼层的当前方向反方向上的最近请求,若存在这种请求,将电梯方向取反:
若该请求在当前楼层,则将该乘客目标楼层设为电梯目标楼层;
否则将该请求出发楼层作为电梯目标楼层。
④若不存在③中那种请求,则选择方向与电梯当前方向相同,但出发楼层在电梯当前楼层的当前方向反方向上的最远请求,若存在这种请求:
将该请求出发楼层作为电梯目标楼层。
⑤若不存在④中那种请求,说明当前没有请求,若接收器关闭则停止运行电梯,否则等待请求到来。
每一次捎带后:
若电梯上行,存在乘客的目标楼层中最高的在电梯目标楼层更高层,则将该楼层设为电梯目标楼层;
若电梯下行,存在乘客的目标楼层中最低的在电梯目标楼层更低层,则将该楼层设为电梯目标楼层。
2.度量分析
(1)复杂度矩阵
方法复杂度:

类复杂度:

扫描调度算法的实现稍微有些复杂,乘客进入电梯和更新目标楼层的方法要遍历对应的捎带图,导致电梯循环复杂度稍高。
(2)类图

(3)协作图

4.bug分析
没有bug。
第七次作业分析
1.设计策略
本次作业为多电梯调度,每个电梯有对应的可达楼层。
我采用的是静态分配请求的策略。新增一个分配器,每个请求刚刚收到就规划好其需要搭乘的第一部电梯及对应的出电梯的楼层,将其分配给对应电梯的调度器,每个电梯由自己的独立的调度器根据自己内部的请求进行独立调度,每个请求出电梯后若未到达目标楼层再新生成请求提交到分配器。
这种策略简单但在一些情况下效率可能不高。
2.度量分析
(1)复杂度矩阵
方法复杂度:


类复杂度:

除了捎带和扫描算法导致的复杂度问题,这次的分配器为每一个可能的x层到y层的请求选择第一次搭乘的电梯和出电梯楼层的方法也较为复杂,另外在主方法中手动创建每个电梯的可达楼层列表使用不少循环导致主方法循环复杂度较高。
(2)类图
(3)协作图

4.bug分析
由于开始写的时间太晚,导致压着时间点完成,最后忙中出错,没有初始化时间戳,这一次作业无效了。
SOLID原则
1.SRP(单一责任原则)
个人感觉三次作业每个类的责任都比较单一,最后一次可能应该写一个类来创建电梯,不应该直接放在主方法中。
2.OCP(开放封闭原则)
第五次作业的调度器接收请求的方法在第六次进行了重写,因为改变了请求队列的存储方式。
3.LSP(里氏替换原则)
没有父子类,不讨论。
4.ISP(接口分离原则)
三次作业的接口设置的都较为合理,没有这方面的问题。
5.DIP(依赖倒置原则)
三次作业的类间依赖都是自然合理的,没有这方面的问题。
总结与心得
多线程编程的debug是一个头疼的大问题,所以一定要从一开始就小心谨慎,尽量避免程序中出现bug。
另外,最重要的:
永远不要拖延!
OO第二单元总结——多线程电梯的更多相关文章
- 2019年北航OO第二单元(多线程电梯任务)总结
一.三次作业总结 1. 说在前面 对于这次的这三次电梯作业,我采用了和几乎所有人都不同的架构:将每个人当作一个线程.这样做有一定的好处:它使得整个问题的建模更加自然,并且在后期人员调度变得复杂时,可以 ...
- OO第二单元总结(多线程的电梯调度)
经过第一单元作业的训练,在做第二单元的作业的时候,要更加的有条理.但是第二次作业多线程的运行,带来了更多的运行的不确定性.呈现出来就是程序会出现由于线程安全问题带来的不可复现的bug.本单元的作业也让 ...
- OO第二单元作业——魔鬼电梯
简介 本单元作业分为三次 第一次作业:第一次作业要实现单部简单电梯,停靠所有楼层,无载客容量,性能分考量电梯运行时间. 第二次作业: 第二次作业实现多部电梯,电梯数量由初始化设定,每部电梯都停靠所有楼 ...
- oo第二单元作业总结
oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...
- OO第二单元多线程电梯总结
OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...
- OO第二单元——多线程(电梯)
OO第二单元--多线程(电梯) 综述 第二单元的三次联系作业都写电梯,要求逐步提高,对于多线程的掌握也进一步加深.本次作业全部都给出了输入输出文件,也就避免了正则表达式判断输入输出是否合法的问题. 第 ...
- 电梯也能无为而治——oo第二单元作业总结
oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...
- OO第二单元电梯线程系列总结作业
电梯系列第一次作业 功能描述: 傻瓜电梯无需考虑超载捎带 线程模式: Producer-Consumer Pattern 思路: 第一次作业是一个傻瓜电梯,分别有一个生产者生成电梯指令(也就是Inpu ...
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
随机推荐
- Python基础(max,min方法)
max函数(min函数使用方法一致): #-----------------max函数----------------- #max之简单层次的使用 li=[1,0,2,45,12,-2,7,9] re ...
- Openresty编写Lua代码一例
1.前段时间纠结了很久,一直弄不清lua和tomcat的联系.一直认为是lua调用tomcat的接口才可使用,后面才明白过来,进入了一个误区,lua本身就是一门独立的脚本语言.在openresty里面 ...
- 【Netty】(4)—源码AbstractBootstrap
源码AbstractBootstrap 一.概念 AbstractBootstrap是一个工具类,用于服务器通道的一系列配置,绑定NioEventLoopGroup线程组,指定指定NIO的模式,指定子 ...
- 前后端同学,必会的Linux常用基础命令
无论是前端还是后端同学,一些常用的linux命令还是必须要掌握的.发布版本.查看日志等等都会用到.以下是我简单的总结了一些简单又常用的命令,欢迎大家补充.希望能帮助到大家 本文首发于公众号 程序员共成 ...
- tcc-transaction 分析
tcc-transaction是TCC型事务java实现,具体项目地址 点我.本文通过tcc-transaction和Springcloud,分析下tcc-transaction的原理. 要了解一个 ...
- 高性能消息队列NSQ
前言 最近我再网上寻找使用golang实现的mq,因为我知道golang一般实现的应用部署起来很方便,所以我就找到了一个叫做nsq的mq,其实它并不能完全称为队列,但是它的轻量和性能的高效,让我真的大 ...
- SLAM+语音机器人DIY系列:(二)ROS入门——6.编写简单的service和client
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- WPF ObservableCollection 异步调用问题
问题介绍 当ObservableCollection列表被UI线程占用时,如果在异步线程中调用ObservableCollection,会弹出以下异常: 问题分析 我们使用一个viewModel,在V ...
- Linux IO模型(同步异步阻塞非阻塞等)的几篇好文章
聊聊同步.异步.阻塞与非阻塞聊聊Linux 五种IO模型聊聊IO多路复用之select.poll.epoll详解
- phpstorm:如何设置代码自动换行
File->Settings->Editor 点击general,如下如所示: 勾选 “ Use soft wrap in editor ” ,这样就可以自动换行了


