第二次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,比如有些情况考虑不完善之类的,也算是对面向对象有 ...
随机推荐
- 踩坑rosbag --clock
将rosbag的数据feed给lego-loam,输出地图.另外写了一个滤波节点,订阅地图,进行滤波操作,再发布出来. 由于输入给lego-loam的数据来自于rosbag,所以需要rosbag提供时 ...
- Firefox控制台日志转入文件
应该说这个需求并不常见-但有时候我的确想过,要是能知道Firefox此时在干吗就好了–有那么几次,该运行的脚本没有运行,状态条显示页面的加载并未完成,但你却永远等不到它. 意外地是,谷哥和度娘似乎并不 ...
- vscode之常用快捷键
原文章地址: vscode: Visual Studio Code 常用快捷键 官方快捷键说明:Key Bindings for Visual Studio Code 主命令框 F1 或 Ctrl+S ...
- visual studio 2015引入开源控件DockPanel(最简单的方法)
一.DockPanel简介 DockPanel是一个开源控件,能够实现子窗口的浮动,在官方给的demo有演示,在vs2017微软已经集成进入常用控件中.我主要使用的是多窗口浮动,和tabControl ...
- 前端反爬虫策略--font-face 猫眼数据爬取
1 .font-face定义了字符集,通过unicode去印射展示. 2 .font-face加载网络字体,我么可以自己创建一套字体,然后自定义一套字符映射关系表例如设置0xefab是映射字符1, ...
- 《深度探索C++对象模型》读书笔记(二)
第三章:Data语意学 这一章主要讲了类中的数据在内存中是如何分配的,包括(多重)继承和多态. 让我们首先从一段代码开始: class X{}; class Y :virtual public X{} ...
- Java解析XML之Dom4j
Java解析XML文件的方法有多种,个人感觉最常用的是使用Dom4j来解析XML文件.下面就简单介绍下Dom4j的基础使用. Dom4j需要jar包的支持,大家可以从网络上下载,如dom4j-1.6. ...
- 通过setup.py安装项目dependencies
一.使用方法 安装命令 $ pip install -e <option> setup.py 二.具体介绍 pip intall -e 举例一个setup.py $ pip int ...
- ssh 公钥无秘登录问题
1. 验证服务启动,网络端口连接正常 可以使用nc,telnet,或者密码模式的ssh来验证 2. 验证ssh client端的配置正确 可以尝试登录另外一台主机, 或者本机自校验 3. 验证ssh ...
- Java学习笔记——鸵鸟学习记(一)
1. 变量 1.1 使用变量 a, 变量三要素:名字 值 类型 b, 变量命名 英文字母,数字,下划线,但不能数字开头 并不是英文单词,用拼音也可以 随便写也可以,但可读性差 区分大小写(Y与y是不同 ...