oo第二单元作业总结
oo第二单元博客总结
在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题。在第三次作业中加入多个电梯线程以后,沿用之前的模式,但是在控制线程的地方进行了部分相应的修改保证任务的完成。
第一次作业—傻瓜电梯
第一次作业是没有任何调度算法的傻瓜电梯,生产者生产请求,将请求加入存储的仓库队列。消费者消费请求,循环从仓库中取出请求,取出一个请求即运送他,直至运送完毕后,再进行循环。
下面是第一次作业的类图,个人感觉还是比较清晰的。

此次作业中由于几乎没有调度要求所以没有查找到bug。
第二次作业—als调度电梯
第二次作业中加入了一些新的调度要求,要求在运送请求的过程中进行捎带,以减少电梯的运行时间。自己的设计主要是在第一次作业的基础上,在电梯运送主请求的过程中,在每一楼层与仓库队列进行交互,查询是否有可以进行捎带的请求,是否可以有从电梯中出去的请求。(本人比较菜,没有进行过多的算法优化,所以此次的作业在保证了简单的正确性的情况下,收获的性能分却很低。

此次自己设计的调度比较简单,所以没有被查找到bug。因为没有自己的测评机,所以在测评中主要用了暴力输入的方式,导致效率非常低下,并且也没有找到别人的bug。
第三次作业—多线程智能电梯
第三次作业加入了更多更加复杂的要求,电梯能够到达的楼层不同,电梯所能够承载的人数不同,这两点是在本人设计电梯的过程中最主要的两点要求,也是在本次作业中本人踩坑的地方。自己的设计主要采用了暴力分配的方法,仓库队列中每进入一个请求,对于请求先进行拆分,如果可以直达,则不进行多余处理;如果不能直达,则一定可以通过一次换乘到达终点,将请求处理完毕后加入仓库队列。电梯线程的设计沿用第二次als调度电梯的设计,在能够到达的楼层与仓库队列进行交互。
第三次作业中个人遇到很大的困难是如何判断电梯线程的停止。由于出现了换乘,所以前两次作业中通过判断输入停止和仓库队列为空的方法不再适用,最终的解决方法是在仓库队列中加入一个人员队列存储所有的请求,只有请求到达最终的终点后才能够从队列中清除掉,将这个人员kill掉,最终的电梯线程停止的判断条件变为输入停止和人员队列为空。
此次电梯的设计出现一个非常愚蠢的bug,就是在电梯判断捎带的过程中,没有判断在该楼层能否停靠,导致了严重的bug。
这是画出的这三次作业的简单的处理图,在第三次中加入了下方的处理类,先将请求进行处理后再进行其他的处理。


心得和体会
这三次多线程作业主要考察的难点就是在线程安全的设计和调度运行的优化等方面,线程安全我主要是采用synchronized同步机制,来锁住输入线程和电梯线程的对于共享变量的操作方法;如果仓库队列为空,则使用wait()和notifyAll()来释放锁和唤醒线程。调度运行的优化方面其实我没有做很多工作,没有成功地加入观察者模式,也没有加入完整的scanner算法,只是进行了简单的捎带简化,因为本身之前对于多线程了解不清晰,在作业中更多的设计主要是想确保线程的安全性。
其实在此次第三次作业中踩了很大的坑,现在回过头来反思,其实很大的原因是课下自己测试的不足,代码测试的重要性是绝对不容许被忽视的。
oo第二单元作业总结的更多相关文章
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
- 电梯也能无为而治——oo第二单元作业总结
oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...
- OO第二单元作业总结【自我反思与审视】
第二单元作业的完成史,就是一部心酸的血泪史…… 多线程的出现为我(们)打开一片广阔的天地,我也在这方天地摸爬滚打,不断成长!如果说第一单元之前还对Java语法有所了解的话,那么这单元学习多线程则完全是 ...
- OO第二单元作业小结
前言 转眼已是第九周,第二单元的电梯系列作业已经结束,终于体验了一番多线程电梯之旅. 第一次作业是单电梯的傻瓜调度,虽然是第一次写多线程,但在课程PPT的指引下,写起来还是非常容易:第二次作业是单电梯 ...
- 电梯模拟系统——BUAA OO第二单元作业总结
需求分析 官方需求 本次作业需要模拟一个多线程实时多电梯系统,从标准输入中输入请求信息,程序进行接收和处理,模拟电梯运行,将必要的运行信息通过输出接口进行输出. 本次作业电梯系统具有的功能为:上下行, ...
- OO第二单元作业分析
前言 这一单元关于线程安全的作业结束了,在助教提供的接口的帮助以及老师提供的设计模型的指导下,这三次作业还是相对轻松地完成了,中间也没有出现什么bug,可能就是因为简单的逻辑不容易出错吧,可惜两次都由 ...
- 你电梯没了—OO第二单元作业思考
写在前面 这三次电梯调度作业,主要是学习多线程并行操作,对于各个线程的时间轴的把握,互相的配合与影响,通过使用锁来解决访问冲突等方面. 个人在学会Thread相关操作之外,写出来一些奇怪结构的诡异操作 ...
- 北航OO第二单元作业总结(2.1~2.3)
在经过第一单元初步认识面向对象编程思想后,本蒟蒻开始了第二单元--多线程部分的学习.本单元的作业是构造符合条件的"目的选层电梯"模型,自行设计调度算法,进行合理调度,完成所有乘客的 ...
- OO第二单元作业——魔鬼电梯
简介 本单元作业分为三次 第一次作业:第一次作业要实现单部简单电梯,停靠所有楼层,无载客容量,性能分考量电梯运行时间. 第二次作业: 第二次作业实现多部电梯,电梯数量由初始化设定,每部电梯都停靠所有楼 ...
随机推荐
- C#学习笔记-XML的读写(一)
需要解析的配置XML <?xml version="1.0" encoding="utf-8" ?> <configurations> ...
- CEC和ARC介绍
众所周知,HDMI作为一个数字化视频音频的接收标准,是可以同时传输视频和音频的,当然随着HDMI版本的提升,它的功能也一直在增强.事实上 当HDMI升级到1.3时,人们就发现了HDMI多了一个CEC功 ...
- 金蝶k3wise 核算项目、辅助资料
金蝶k3wise 核算项目.辅助资料 ----核算项目信息 select * from t_ItemClass ----核算项目字段信息 --锁定字段 ----核算项目内容表 select * fro ...
- .net core 2.x - 缓存的四种方式
其实这些微软docs都有现成的,但是现在的人想对浮躁些,去看的不会太多,所以这里就再记录下 ,大家一起懒一起浮躁,呵呵. 0.基础知识 通过减少生成内容所需的工作,缓存可以显著提高应用的性能和可伸缩性 ...
- labview出现系统998错误
1.环境:xp,labview2015, 2.经过:初始状态正常,系统需要运行2016的打包的程序,运行不了,后下载了一个2016打包后的程序,点击安装,未提示异常.桌面添加了快捷方式,点击快捷方式, ...
- CentOS 7 yum方式快速安装MongoDB
一.安装环境及配置yum # more /etc/redhat-release CentOS Linux release 7.2.1511 (Core) # vi /etc/yum.repos.d/m ...
- PHP var_dump()函数输出不完整,有省略号?解决办法
xdebug.var_display_max_children=10240xdebug.var_display_max_data=10240xdebug.var_display_max_depth=1 ...
- 大数据集群ssh登录其他机器失败 RSA host key for zb03 has changed and you have requested strict checking. Host key verification failed.
[hadoop@zb02 .ssh]$ scp authorized_keys hadoop@zb03:/home/hadoop/.ssh @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...
- Django——图书管理系统
基于Django的图书管理系统 1.主体功能 1.列出图书列表.出版社列表.作者列表 2.点击作者,会列出其出版的图书列表 3.点击出版社,会列出旗下图书列表 4.可以创建.修改.删除 图书.作者.出 ...
- Selenium 2自动化测试实战
Selenium 2自动化测试实战 百度网盘 链接:https://pan.baidu.com/s/1aiP3d8Y1QlcHD3fAlEj4sg 提取码:jp8e 复制这段内容后打开百度网盘手机Ap ...