这次的系列作业是写一个电梯调度,主要目的是让我们熟悉多线程。

  第一次作业是一个傻瓜电梯的调度问题,要求也很简单,即每次接一个人就行了。我只用了两个线程,一个是输入线程,一个是电梯线程,输入线程负责从标准输入中读入请求并加入到请求队列中,电梯线程负责从请求队列中取出请求并执行,思路非常简单,每次取一个请求,把人送到后,再取下一个,直到取完并且输入停止。

  第二次作业没有什么本质区别,只不过修改了调度算法,在电梯运行时进行捎带,我这里的思路是,先找到一个主请求,然后在去接主请求和送主请求去目的地的路上,每到一层先判断是否有人要出去,再判断是否能捎带,如果能加进来,不能继续走,这里还需要对开关门做一下判断,不能没到一层都开关门,有需求才去开门关门,然后还有一点就是对于这个捎带,每进来一个人,要加入到电梯队列,好在他需要出去的时候让他出去,同时还需要更新楼层,即当前是从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博客作业--多线程电梯的更多相关文章

  1. BUAA_OO第二单元总结性博客作业——多线程电梯架构

    一.设计策略 在第一次作业时,我刚第一次接触多线程这个东西……于是乎对于第一次VIP直上直下一次只接一个人的电梯,我借鉴了指导书中为我们提供的架构,设计了一个输入线程和一个电梯线程,并设置了一个中间类 ...

  2. OO博客作业4:第13-14周作业总结

    一.论述测试与正确性论证的效果差异,比较其优缺点 测试是设计若干组测试用例,运行程序并检验其是否完成预期功能.测试是一种直接发现BUG的方法,可以准确断定什么样的BUG会发生,并通过辅助调试进一步确定 ...

  3. OO博客作业1:第1-3周作业总结

    (1)基于度量来分析自己的程序结构 注:UML图中每个划分了的圆角矩形代表一个类或接口,箭头可代表创建.访问数据等行为.类的图形内部分为3个部分,从上到下依次是类的名称.类包含的实例变量(属性).类实 ...

  4. 第四次oo博客作业

    (1)本单元是撰写UML数据分析器,架构大致如下,在指导书要求的函数外,对于UmlClass类,Umlinterface类,以及状态机,顺序图这四个类重现构造一个类,这个类里有他们所需要的全部信息,另 ...

  5. OO博客作业-《JML之卷》

    OO第三单元小结 一.JML语言理论基础以及应用工具链情况梳理 一句话来说,JML就是用于对JAVA程序设计逻辑的预先约定的一种语言,以便正确严格高效地完成程序以及展开测试,这在不能容忍细微错误的工程 ...

  6. OO博客作业2:第5-7周作业总结

    (1)从多线程的协同和同步控制方面,分析和总结自己三次作业来的设计策略及其变化. 第5次作业:多线程电梯 基本照搬了课件上“生产者-消费者”模型的设计策略,将InputHandler设计为生产者线程, ...

  7. OO博客作业3:第9-11周作业总结

    一.总结介绍规格化设计的大致发展历史和为什么得到了人们的重视 1.规格化设计的大致发展历史 规格化设计,又称契约式设计,最早由Bertrand Meyer于1986年提出,出自于<面向对象软件构 ...

  8. 第一次oo博客作业--表达式求导

    (1)说实话我这部分真的不知道写些什么,因为我只有第三次作业写了两个类,前两次都是一个类,一个类的好处可能也就是写起来比较方便(不用抽象什么共性了,直接c语言莽过去),缺点很多,架构不清晰,可读性不高 ...

  9. OO博客作业

    第一次多项式的作业感觉还行,同时用c和java写的话也算是一个从c到java的过渡,也算是有了对 java的初步认识,之后的电梯作业出血了一些小BUG,比如有些情况考虑不完善之类的,也算是对面向对象有 ...

随机推荐

  1. Open Source 开发工具集

    Open Source 开发工具集 转自:http://www.linuxforum.net原作者:gogoliu(Pooh-Bah) 编辑器: vi:老牌编辑器,在各个unix和unix-like平 ...

  2. 为Owin项目增加WebApi

    上一篇文章我们新建了一个Owin项目. 本节,我们来为其增加WebApi功能 项目右键>添加>新搭建基架的项目 选择Web API 2控制器 为默认控制器命名 点击添加后项目结构如下: 将 ...

  3. ADO.Net操作数据库的方式

    1.使用数据提供程序执行sql或者ddl语句操作数据库. 2.使用oledb操作数据库 3.使用odbc操作数据库 4.使用DataSet操作数据库 前面3种方式都无法避免要使用sql语句,对不同种类 ...

  4. 前后台数据交换,printwriter、jsonobject、jsonarray、ajax请求,数据交换

    后台代码: public void findByIDEquipment() { getResponse().setCharacterEncoding("UTF-8"); getRe ...

  5. MD5加密出现 无法启动:此实现不是Windows平台FIPS验证的加密算法的一部分

    出现问题: 出现这个问题的原因是订票助手.NET使用了MD5算法,而系统的组策略安全设置导致无法使用此算法.要修正此问题,请按照如下操作(两种方法任选其一). 注:(来源于  http://ask.f ...

  6. ubuntu16.04 HyperLedger Fabric 1.2.0 开发环境搭建

    安装准备 1. 安装git.cRUL.gcc/g++和make $ sudo apt-get update $ sudo apt-get install build-essential git cur ...

  7. 使用SQL SERVER 来自动发送邮件

    可以使用SQL SERVER 来发送自动邮件,主要是使用SQL SERVER 的dbo.sp_send_dbmail 存储过程(在msdb数据库中). 具体步骤如下: Step1: 编写要发送的邮件内 ...

  8. zxing生成二维码和条码

    /*** * 生成二维码方法 * @param str 生成内容 * @param widthHeight 宽度和高度 * @return * @throws WriterException */ p ...

  9. ADT工具使用详解

    备注:一下内容为本人手工翻译官方文档注解,如有翻译不到位的地方,欢迎批评指正; ADT(Android开发工具)是Eclipse的插件,它提供了一套与Eclipse IDE集成的工具.它可以让您访问许 ...

  10. pycharm移动项目文件后,运行报错

    pycharm移动项目文件后,运行报错: ModuleNotFoundError:  No module named 'D:/my_project/my_cases/email139cases/tes ...