第二次oo博客作业--多线程电梯
这次的系列作业是写一个电梯调度,主要目的是让我们熟悉多线程。
第一次作业是一个傻瓜电梯的调度问题,要求也很简单,即每次接一个人就行了。我只用了两个线程,一个是输入线程,一个是电梯线程,输入线程负责从标准输入中读入请求并加入到请求队列中,电梯线程负责从请求队列中取出请求并执行,思路非常简单,每次取一个请求,把人送到后,再取下一个,直到取完并且输入停止。
第二次作业没有什么本质区别,只不过修改了调度算法,在电梯运行时进行捎带,我这里的思路是,先找到一个主请求,然后在去接主请求和送主请求去目的地的路上,每到一层先判断是否有人要出去,再判断是否能捎带,如果能加进来,不能继续走,这里还需要对开关门做一下判断,不能没到一层都开关门,有需求才去开门关门,然后还有一点就是对于这个捎带,每进来一个人,要加入到电梯队列,好在他需要出去的时候让他出去,同时还需要更新楼层,即当前是从5-10,进来一个从7-11的,那么目的楼层即变更为11,运行完毕后再去请求队列取下一个主请求。
第三次作业应该是最难的一次,因为涉及到3个电梯,对于这次作业我设计了5个线程,三个电梯线程,1个输入线程,1个调度线程,三个电梯线程本质和第二次作业一样,只不过增加了判断是否满员这一条件,以及输出时增加电梯编号,改一下一层运行时间就ok了,输入线程最为简单,输入进来就通知调度器,并加入队列,结束时改变调度器状态就ok了,主要说一下之前都没有过的调度线程。调度线程的用处是从请求队列中取出指令,判断是否需要拆分,并分配给合适的电梯这里我的思路是,如果他是一个一个电梯送不到的请求,则把他差分成fromflour->1,以及1->toflour,在这里需要注意,只有前半部分完成了,后半部分才可以开始,因此我们需要对此进行标记,每到一层当有人出去时,判断是不是拆分请求,如果是则把另一部分的标记去掉,让调度器可以去分配他;还有就是调度器的分配,当然是能一部电梯完成的就给这部电梯,但是当有多部电梯都能完成时,该怎么办呢?是给最快的还是电梯队列中人数最少的?我没有什么特别好的思路,因为我不会证明这两种哪个更快一些,比如当一共只有6个请求,A电梯和B电梯都能完成,这时候给全给A电梯肯定是最好的选择,但是如果有12个呢,那么平均分配一下是更快的,所以我还是采取了平均分配的策略,下面上一下第三次作业的方法参数图:
可以看出来,三个电梯类方法参数个数完全一样,只不过某些参数有些许不同,这样我们完全可以用一个类去写,多传一些参数进去即可,但是我却很笨的用了三个类,这也导致在debug的时候,需要发现一处问题要在三个类里修改,很容易忘记造成错误。
第一次作业可谓非常简单,基本上是两次过了,所以没什么bug,第二次作业我在写调度的时候出了一堆问题,无非是什么忘了更新楼层的问题,很好debug,主要说一下第三次作业。我第三次作业三个电梯所以写了三个类,其实完全可以用一个类,只更改一些参数即可,可是我却脑子一抽用了三个类,这就导致我在修改电梯代码时,改一个需要改三处,这就导致,有的时候会有忘改的地方,使得我最后强测错了,就是ac电梯改了,b电梯没改,80的强测分让人有点心痛,希望下次能不犯这样的错误。这里有个好消息是我的线程安全似乎没出什么问题,对于以后的多线程作业能有一个好的架构。
这里安利一个超级无敌的东西,评测机,用评测机去对拍bug可以发现很多线程安全的bug,交上去就是一发aoe,所以如此看来,也并没有什么策略一说,对拍真的是找bug效率最高的办法。(c组狼人都靠的这个,如果你觉得很不爽,一定要去学习一下怎么写哦)
最后是对这系列作业的一点点感想:我终于感觉到自己是在写java了,就像我上一篇说的,我在多项式求导中没有想出好的架构,最后直接一类到底莽下去了,其中各个方法完全是按照c语言的方法写的,这次作业则完全不一样,终于有了面向对象编程的感觉!
言归正传,线程安全是最重要的东西,因为你一旦线程不安全,bug不好测试,好不容易找到一个,又不好复现,而且不容易修复,所以在一开始设计时,就要想好架构,想好老师说的,共享数据一定要确保线程安全,还有架构的设计就是各个部分干各个部分的事情,这样比较好思考也好修复bug。
第二次oo博客作业--多线程电梯的更多相关文章
- BUAA_OO第二单元总结性博客作业——多线程电梯架构
一.设计策略 在第一次作业时,我刚第一次接触多线程这个东西……于是乎对于第一次VIP直上直下一次只接一个人的电梯,我借鉴了指导书中为我们提供的架构,设计了一个输入线程和一个电梯线程,并设置了一个中间类 ...
- OO博客作业4:第13-14周作业总结
一.论述测试与正确性论证的效果差异,比较其优缺点 测试是设计若干组测试用例,运行程序并检验其是否完成预期功能.测试是一种直接发现BUG的方法,可以准确断定什么样的BUG会发生,并通过辅助调试进一步确定 ...
- OO博客作业1:第1-3周作业总结
(1)基于度量来分析自己的程序结构 注:UML图中每个划分了的圆角矩形代表一个类或接口,箭头可代表创建.访问数据等行为.类的图形内部分为3个部分,从上到下依次是类的名称.类包含的实例变量(属性).类实 ...
- 第四次oo博客作业
(1)本单元是撰写UML数据分析器,架构大致如下,在指导书要求的函数外,对于UmlClass类,Umlinterface类,以及状态机,顺序图这四个类重现构造一个类,这个类里有他们所需要的全部信息,另 ...
- OO博客作业-《JML之卷》
OO第三单元小结 一.JML语言理论基础以及应用工具链情况梳理 一句话来说,JML就是用于对JAVA程序设计逻辑的预先约定的一种语言,以便正确严格高效地完成程序以及展开测试,这在不能容忍细微错误的工程 ...
- OO博客作业2:第5-7周作业总结
(1)从多线程的协同和同步控制方面,分析和总结自己三次作业来的设计策略及其变化. 第5次作业:多线程电梯 基本照搬了课件上“生产者-消费者”模型的设计策略,将InputHandler设计为生产者线程, ...
- OO博客作业3:第9-11周作业总结
一.总结介绍规格化设计的大致发展历史和为什么得到了人们的重视 1.规格化设计的大致发展历史 规格化设计,又称契约式设计,最早由Bertrand Meyer于1986年提出,出自于<面向对象软件构 ...
- 第一次oo博客作业--表达式求导
(1)说实话我这部分真的不知道写些什么,因为我只有第三次作业写了两个类,前两次都是一个类,一个类的好处可能也就是写起来比较方便(不用抽象什么共性了,直接c语言莽过去),缺点很多,架构不清晰,可读性不高 ...
- OO博客作业
第一次多项式的作业感觉还行,同时用c和java写的话也算是一个从c到java的过渡,也算是有了对 java的初步认识,之后的电梯作业出血了一些小BUG,比如有些情况考虑不完善之类的,也算是对面向对象有 ...
随机推荐
- Difference between ulimit, lsof, cat /proc/sys/fs/file-max
https://unix.stackexchange.com/questions/476351/difference-between-ulimit-lsof-cat-proc-sys-fs-file- ...
- webpack打包vue -->简易讲解
### 1. 测试环境: 推荐这篇文章:讲的很细致 https://www.cnblogs.com/lhweb15/p/5660609.html 1. webpack.config.js自行安装 { ...
- Kettle解决方案: 第一章ETL入门
第一章ETL入门 1.1 OLPT和数据仓库对比 普通的事务系统和商业智能系统(BI)有什么区别? 1个独立的普通事务系统也被称为在线事务处理系统(OLTP) 商业智能系统也常被称为决策支持系统(DS ...
- Azure CosmosDB (8) 性能指标Request Unit-RU
<Windows Azure Platform 系列文章目录> 本次将介绍Cosmos DB的性能指标RU (Request Unit). 总的来说,我们设置的Azure CosmosDB ...
- 创建maven工程的时候卡死的解决办法
在idea的maven,runner,properties里面添加 archetypeCatalog=internal
- mvc中让路由忽略带后缀的路径文件
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/ ...
- [UE4]Add Offset
在原来值的基础上增加偏移
- Linux内存解读
1.free -m命令 [root@crawler ~]# free -m total used free shared buffers cached Mem: -/+ buffers/cache: ...
- 错误 88 error C2248: “CObject::CObject”: 无法访问 private 成员(在“CObject”类中声明) c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxcoll.h 590
最近接收了以前新公司遗留的代码,一个函数动不动就少的一千行,多的几千行,真是受不了这编码风格! 于是便使用了VS自带的重构工具,选择代码后右键-重构-提取方法,提取完方法就编译不过,想了好久原因,原来 ...
- nvm 查看node版本
1. 查看有哪些 node 版本 命令: nvm ls-remote 2. 查看本地node版本 nvm list 3. 版本切换 nvm use 版本号