OO第二次博客——电梯系列总结
OO第二次博客分享
第一次电梯
第一次电梯又叫傻瓜电梯(FAFS)。而我也是初次接触多线程,所以对电梯运载人的方式没有多加考虑,仅做傻瓜调度。
即Input线程负责接受Request,并将其直接添加在队列Queue尾。Elevator线程则从Queue取出队头Request,并完成相应的运送和信息输出。
本次作业主要感受和学习多线程,并“回归”靠输出内容进行调试的时代。
第二次电梯
第二次电梯对调度进行了优化,需判断捎带情况以减小电梯运行时间。
本次作业共设置两个队列,分别为总请求队列和电梯内队列。对每个Request增加status属性,用以标志人在电梯内/外和已被运送至目的地。
对电梯增加direction属性用以反应电梯的上下方向。且需注意-1层到1层的特判,防止出现0层。
我的调度器(Controller)依然是一个类而非一个新的线程。调度器主要实现对Request和Elevator的信息判断而确定电梯是否需要开门进/出人。将当前楼层作为参数传入,遍历电梯内队列,判断是否有人出去;遍历等待队列,结合电梯运行方向,判断是否有人要进来。
由于我的调度器中方法写的较少且简略,许多判断操作是在电梯内进行的。这也造成了方法爆行数orz。
如果总请求队列中未处理人数大于电梯内人数或电梯中队列人数大于0,则电梯线程保持醒来状态,否则使其wait,直到有新的请求将其唤醒或因无新输入达到结尾而结束。电梯运行分为电梯中无人和有人两种。无人则取等待队列队首,并依据此设置接到人后电梯的diretion等;有人则在去往目的楼层时,在每层遍历电梯内队列和等待队列,进行对人的操作,直到无人为止。
第三次电梯
第三次电梯共有三部电梯,并需实现换乘。
共设置四个队列,总请求队列sumQueue包涵所有Request,也是其接收Input向其的输入。剩余三个队列为三部电梯的专属队列。共有Input,Elevator和Controller三个线程。
调度器的作用是:从sumQueue不断取出Request,对其进行信息判断后加入到对应电梯的队列中。
ifonly()方法判断其是否只能从单一电梯上;对于固定上某部电梯的Request,onlyifzhida()方法判断该部电梯是否能直达目的楼层;对于不固定上某个电梯的Request,由电梯运行速度可知:如果A能直达选A,再判断B,最后C;非直达则拆分路径。我的做法是先送去一层,生成新的Request,因为一层有三部电梯可选。
三部电梯行为都是相同的,由i确定是哪部电梯在运行。每部电梯由数组存储可到达楼层信息,用isstop()方法判断是否停靠。
电梯仅需遍历自己的队列进行判断和操作。与第二次电梯相比,增加对Request是否进行换乘的判断。需换乘则生成新的Request。
电梯运行还是分为电梯中有人和无人两种情况,与第二次类似。且此次为避免出现和第二次一样爆方法行数的问题,将需多次调用的电梯的move和sleep都拆分成了小方法。
本次作业,对锁和唤醒的要求也较高,我也寻求了大佬的帮助,才得以将其锁清楚。一定要避免暴力轮询和死锁。三条队列要唤醒时,必须唤醒所操作队列,不能一口气全部唤醒。
bug分析
前两次未找到bug,第三次掐死线失败……没来得及提交上评测机。TAT再也不能因为没de完bug一次都不交了TAT
Applying Creational Pattern
这三次作业(尤其是后两次)充分体现了先思考、构架再动手的重要性。且尤其是第三次作业,线程安全是十分重要的,一定要弄清楚何时该锁何时唤醒。
转载于:https://www.cnblogs.com/lujubei/p/10754155.html
OO第二次博客——电梯系列总结相关推荐
- 博客搬家系列(六)-爬取今日头条文章
博客搬家系列(六)-爬取今日头条文章 一.前情回顾 博客搬家系列(一)-简介:https://blog.csdn.net/rico_zhou/article/details/83619152 博客搬家 ...
- C语言第二次博客作业---分支结构
C语言第二次博客作业---分支结构 一,PTA实验作业 题目1.计算分段函数 本题目要求计算下列分段函数f(x)的值 1.代码 double x, result;scanf("%lf&quo ...
- 【全网最全的博客美化系列教程】06.推荐和反对炫酷样式的实现
全网最全的博客美化系列教程相关文章目录 [全网最全的博客美化系列教程]01.添加Github项目链接 [全网最全的博客美化系列教程]02.添加QQ交谈链接 [全网最全的博客美化系列教程]03.给博客添 ...
- 【精】【火】关于CSDN博客与博主的第二个博客之间的区别与联系
因为CSDN不能上传视频,和嵌入视频链接的原因: 本人在今天将会使用另外一个博客,当然CSDN博客也会经常使用! 本CSDN博客将会以记录技术细节,和编程风格,学习以及仿照大佬代码等这些博文: 而新的 ...
- 【全网最全的博客美化系列教程】08.自定义地址栏Logo
全网最全的博客美化系列教程相关文章目录 [全网最全的博客美化系列教程]01.添加Github项目链接 [全网最全的博客美化系列教程]02.添加QQ交谈链接 [全网最全的博客美化系列教程]03.给博客添 ...
- 2022北航敏捷软件工程 第二次博客作业
2022北航敏捷软件工程 第二次博客作业 项目 内容 这个作业属于哪个课程 2022年北航敏捷软件工程 这个作业的要求在哪里 个人作业-软件案例分析 我在这个课程的目标是 了解软件工程的方法论.在实践 ...
- 领奖啦!第二期博客征文《从HelloWorld启航——说说那些年我们一起写过的代码》获奖名单揭晓
让大家久等了,下面颁布第二期博客征文<从HelloWorld启航--说说那些年我们一起写过的代码>获奖博文名单: 排名 标题 文章地址 1 从Hello World到defmacro,那些 ...
- 博客搬家系列(一)-简介
这个功能思来想去想了很久,终于实现了基本功能,自己基于别人的后台权限管理系统写了一个博客系统,其实博客系统只是一小部分,但今天只讲博客部分,其他详见: RZSpider详见:https://blog. ...
- 【全网最全的博客美化系列教程】02.添加QQ交谈链接
全网最全的博客美化系列教程相关文章目录 [全网最全的博客美化系列教程]01.添加Github项目链接 [全网最全的博客美化系列教程]02.添加QQ交谈链接 [全网最全的博客美化系列教程]03.给博客添 ...
- 【全网最全的博客美化系列教程】05.公告栏个性时间显示的实现
全网最全的博客美化系列教程相关文章目录 [全网最全的博客美化系列教程]01.添加Github项目链接 [全网最全的博客美化系列教程]02.添加QQ交谈链接 [全网最全的博客美化系列教程]03.给博客添 ...
最新文章
- 打印出所有的 info.plist 中的 keys、values
- 【模块】脉搏血氧仪和心率监测仪生物传感器MAX30102
- [转] 能ping通,但不能上网.
- java不会框架怎么办_感觉学java无从下手了,各种框架乱七八糟,感觉好乱。该怎么办!?...
- SpringHttpInvoker解析2-服务端实现
- ubuntu 安装 guetzli
- 从代码层面优化系统性能的解决方案
- ArcGIS学习总结(四)——缓冲区分析应用
- HG255D 刷机备忘
- Java之JvisualVM简介
- 【测试基础】Linux文本编辑vi命令
- 墙裂推荐9个在线图片压缩网站
- 「教程」Windows程序未响应,怎么分析确认具体原因
- 前端-HTML基础入门
- 闲鱼卖货,月入1.5w的小众类目分享。
- 一切恍如昨日,却又截然不同...
- vue3语法糖父子组件的通信
- 超详细版:Python 这样安装如此简单(Windows)
- 工作这两年的经验与教训
- 【考研英语语法】介词短语
热门文章
- vant 软键盘_H5页面 绝对定位元素被 软键盘弹出时顶起
- nodejs升级命令_又一阵后浪:横空出世的Deno会取代NodeJS吗?
- c语言中fprintf的作用,C语言中的printf(),sprintf()和fprintf()
- python ascii转字符串_Python将混合ASCII代码转换为字符串
- vb6 英文和中文长度不同_PPT里中文排版就是没英文好看?你怕是假酒喝多了…...
- 【2019南昌邀请赛网络赛I:】Max Answer(st表+单调栈(新模版)+分析)
- centos nginx php_Centos7下NGINX+PHP的安装及配置
- 命令行Terminal增加proxy开关
- 多个 本地仓库_老板逼我用 Git,本地指令介绍
- 剑指offer JZ02/05 替换空格 Python