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 ...
随机推荐
- Java同步容器
一.为什么会出现同步容器 Java的集合框架中,主要有四大类别:List,Set,Queue,Map List,Set,Queue接口分别继承了Collection接口,Map本身是一个接口. 注意C ...
- POJ 2031 Building a Space Station (计算几何+最小生成树)
题目: Description You are a member of the space station engineering team, and are assigned a task in t ...
- SqlCommand.Parameters的使用
在c#中执行sql语句时,避免会遇到传参的问题.Parameters就是用来做参数化查询,不然很容易被黑客拿到数据. 一.简介 引用自:https://msdn.microsoft.com/ZH-C ...
- Alpha 冲刺 (9/10)
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:冲刺倒计时之9 团队部分 后敬甲(组长) 过去两天完成了哪些任务 答辩准备中 和大佬们跟进进度 接下来的计划 准备答辩 ...
- Java——super 与 this 关键字
super 与 this 关键字 super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类. this关键字:指向自己的引用. package ti; public ...
- Java_修饰符
目录 访问控制修饰符 非访问修饰符 在java中修饰符主要分为两类:++访问修饰符++和++非访问修饰符++ 访问控制修饰符 修饰符 当前类 同一包内 子孙类 其他包 其他包子孙类 public Y ...
- cf1153D 树形dp+思维
一千八的题也不会做了呜呜呜 size[u]表示结点u下的叶子结点, 思维:可以想到一个子树对其父亲会有一个消耗值 考虑一个点如果是max,那么其最大值可以是size[u]-p,p是消耗值最小的子树 一 ...
- 不装插件,查看.rp文件
AxShare国内平台地址:http://share.axure.org临时急用可以使用公用帐户.用户名:axure@webppd.com,密码:webppd123 上传.rp文件,点击 url 地址 ...
- Spark之join、leftOuterJoin、rightOuterJoin及fullOuterJoin
Spark的join与mysql的join类似,mysql的join是将表与表之间连接查询,spark中join是将RDD数据集进行连接,Spark主要有join.leftOuterJoin.righ ...
- c#堆与栈
一.在讲堆栈之前,我们先看看值类型和引用类型: 1,我们看看值类型与引用类型的存储方式: 引用类型:引用类型存储在堆中.类型实例化的时候,会在堆中开辟一部分空间存储类的实例.类对象的引用还是存储在栈中 ...