2019OO第二单元总结
(1)设计策略
电梯第1次作业是一个傻瓜调度电梯,使用先来先服务原则,不用考虑捎带(可以认为电梯的载客量为1),因此比较简单,调度器用一个队列就可以。
使用生产者-消费者模型,输入线程是生产者,电梯是消费者,
除了主线程之外有两个线程,电梯线程和输入线程,输入线程负责在接收到请求后加入到调度器队列的队尾中,调度器通过队列实现,电梯线程负责从调度器的队头取出一个请求,然后走到请求的出发楼层,开门、上人、关门,然后走到请求的到达楼层,开门、下人、关门。
在调度器为空,且输入线程停止(遇到EOF)的时候,电梯线程停止,程序结束。
总体来说比较简单,在强测和互测环节中没有发现bug。
第二次作业是一个可捎带电梯,并且有负数楼层,不用考虑电梯的载客量。
我的调度方案是参考现实情况下的电梯,走到需要到达的最高层(考虑请求出发层和电梯内请求的到达层)后,折返,走到需要到达的最低层,然后再折返,运行期间在需要停靠的楼层(电梯内有人要到达该楼层,或者该楼层外面有人需要上电梯)停靠。
除了主线程之外有三个线程,电梯线程、输入线程、调度器线程(相比第一次作业而言新增),调度器线程负责在接收到请求之后把该请求放到相应的楼层数组中,并且计算出折返的楼层。
第三次作业比较复杂,三个电梯,有载客量的要求,每个电梯可以停靠的楼层不同。
我基本参考了第二次作业,调度算法也是和第二次作业差不多,但是对于不可直达、需要换乘的请求,我的思路是先把这些请求送到1层或15层,然后让这些请求到电梯外(相当于在1层/15层投放了请求),之后另一个电梯过来把请求带到相应的终点。
(2)度量
第一次作业:
第二次作业:
第三次作业:
可以看出,复杂度较高的是Elevator.run()和Tray.run(),是由于在这些方法中,我用了特别过程化的方式,这里确实有可以改进的地方。
(3)分析bug
前两次作业的强测和互测都没有发现bug,但是第三次作业强测和互测都被发现了TLE的bug,是因为程序最后停不下来导致的超时,在输入线程停止的时候对电梯线程处理不当造成的,这也是我考虑不够全面,以及本地测试不够全面造成的。
(4)发现bug的策略
由于多线程程序测试的难复现性,以及多线程程序与单线程程序的不同,我在本地测试的时候参考了这个帖子:
https://course.buaaoo.top/assignment/56/discussion/157
项目地址:https://github.com/Mistariano/buaaoo-elevator-test-suit
这个程序替换了原来的IO接口,可以定时投放请求,这样就可以进行黑箱测试了。
(5)心得体会
这几次的作业是有关多线程的,在思路上就与单线程的程序有很大的不同。我经历了第一单元的单线程作业之后,已经有了面向对象的思想,使得我在第二单元的作业中不会再出现特别面向过程的程序。这次作业的难点是要考虑线程安全,通过synchronized同步语句(但同时也要避免互锁),以及一些线程安全的类和方法,解决线程安全的问题。
2019OO第二单元总结的更多相关文章
- 2019OO第二单元作业总结
OO第二单元的作业主题是模拟电梯. ---------------------------------------------------------------------------------- ...
- OO第二单元作业小结
前言 转眼已是第九周,第二单元的电梯系列作业已经结束,终于体验了一番多线程电梯之旅. 第一次作业是单电梯的傻瓜调度,虽然是第一次写多线程,但在课程PPT的指引下,写起来还是非常容易:第二次作业是单电梯 ...
- BUAA面向对象设计与构造——第二单元总结
BUAA面向对象设计与构造——第二单元总结 第一阶段:单部傻瓜电梯的调度 第二阶段:单部可捎带电梯的调度 (由于我第一次写的作业就是可捎带模式,第二次只是增加了负数楼层,修改了一部分参数,因此一起总结 ...
- 我永远爱着OOP——第二单元作业总结
第二单元的电梯真是愉♂快呢,多线程编程作为java编程OOP中的重要组成部分,通过这一个单元的学习,我也是有了很多全新的认识 那么下面就先例行一下公事 三次作业分析 第五次作业 设计分析 实现的电梯是 ...
- oo第二单元作业总结
oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...
- OO第二次博客作业--第二单元总结
第一次作业 1. 设计策略 第一次作业,一共三个线程,主线程.输入线程和电梯线程,有一个共享对象--调度器(队列). 调度的策略大多集中到了电梯里,调度器反而只剩下一个队列. 2. 基于度量的分析 类 ...
- 第二单元电梯调度作业 By Wazaki
figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...
- OO第二单元总结(多线程的电梯调度)
经过第一单元作业的训练,在做第二单元的作业的时候,要更加的有条理.但是第二次作业多线程的运行,带来了更多的运行的不确定性.呈现出来就是程序会出现由于线程安全问题带来的不可复现的bug.本单元的作业也让 ...
- OO第二单元电梯线程系列总结作业
电梯系列第一次作业 功能描述: 傻瓜电梯无需考虑超载捎带 线程模式: Producer-Consumer Pattern 思路: 第一次作业是一个傻瓜电梯,分别有一个生产者生成电梯指令(也就是Inpu ...
随机推荐
- JSON 之 SuperObject(11): TSuperTableString、TSuperAvlEntry
JSON 之 SuperObject(11): TSuperTableString.TSuperAvlEntry - 万一 - 博客园http://www.cnblogs.com/del/archiv ...
- 忘记mysql的登陆密码该怎么办?
1.如果忘记了其他用户的密码,可以使用root账户进入mysql,修改mysql.user表中的用户密码 2.如果忘记了root的mysql密码,可以使用如下方式: 确认服务器处于安全的状态,也就是没 ...
- CF1119C Ramesses and Corner Inversion
题目地址:CF1119C Ramesses and Corner Inversion 将两个矩阵异或起来,为 \(1\) 的位置就是需要修改的位置 注意到每一次操作都会导致两行和两列上有两个数被修改 ...
- sed 使用行号与关键字匹配限定行范围
1.打印匹配数字4 到最后一行 [111 sed]$ cat input [111 sed]$ sed -n '/4/,$p' input
- RDay2-Problem 2 B
题目描述 小明家有n个信箱,前前后后来送信和取信的总次数为q,称为q次访问,其中这q次访问分成三种类型. 1:邮递员送来了一封信,放在了x号信箱. 2:小明取走了x号信箱的所有信(x信箱可能已经没有信 ...
- Java_String&StringBuilder&StringBuffer类
目录 一.String类 二."==" 和 "equals"的区别 三.StringBuffer和StringBuilder 一.String类 String为 ...
- from表单校验插件 validate 实例
$("#nextSubmit").click(function(){ $("#recovePasswordForm").submit(); }); $(&quo ...
- 网络流24题——试题库问题 luogu 2763
题目描述看:这里 这是我们遇到的第一个要求输出方案的问题 考虑建图然后用最大流思想: 首先由源点向每一道试题连边,容量为1 然后由每一种试题类型向汇点连边,容量为需求量 最后由每一道试题向可能属于的试 ...
- django请求生命周期,FBV和CBV,ORM拾遗,Git
一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post, ...
- SQL允许脏读WITH(NOLOCK)
使用WIHT(NOLOCK)有利也有弊,所以在决定使用之前,你一定需要了解清楚WITH(NOLOCK)的功能和缺陷,看其是否适合你的业务需求,不要觉得它能提升性能,稀里糊涂的就使用它. --事务未提交 ...