oo第二单元的自白
电梯第一次作业
第一次电梯较为简单,主要目的在于初步接触多线程,可以实现一些简单的操作。
在本次作业中,为了更好的了解多线程,我也阅读了一些代码,并据此仿写完成了第一次作业。
根据生产者和消费者的模式,读入线程即为生产者,电梯与调度器一起为消费者。仓库的容量为1,故两线程相互进行等待(这主要是没有真正的理解其原理,而迫不得已的仿写)。

电梯第二次作业

第二次作业的构造大体与前相同,不过没有开新的线程进行读入处理,而是直接在main方法中进行。
实际调度类似于scanner,但却又比其差了一些。
(其实,我是按照指导书提供的想法进行实现。但我的理解和别人不大一样,当电梯中有人时,即将电梯中第一个进入的人的请求作为主请求,电梯无人,将第一个等待的人的请求作为主请求,而一旦有人进出电梯,立即进行一次主请求的刷新。)
电梯第三次作业


本次作业最重要的一个问题就是如何进行电梯间的通信(多电梯完成一个request时)和有效的利用电梯资源(优化)。
在此,我进行的处理是,将scheduler作为一个共享的对象,其内的成员变量为三个list,分别对应于三部电梯。
将需要多个电梯完成的任务进行拆分,在人为到达时,将list中的有效位置为false,当人到达中转站时,置为true。
三次作业中的问题与一些想法
第一次作业作为入门,几乎完全照抄生产者与消费者模式。
第二次作业,有了第一次的基础后,又理解了一些内容,进行了改进。
1.将读入方法归入到main中
2.仓库容量从1改为无穷大,即删除了读入方法中的wait,由接口提供的阻塞方法来完成wait。
3.第一次作业直接使用synchronized包装run方法,第二次将新写的共享对象类中的方法进行synchronized包装,减小了包装的大小。
第三次作业,实际上大体思路延续第二次,但又有一些问题。
1.在自己课下debug的过程中,发现了电梯停不下来的情况,经过反反复复的debug,发现是关于暂停信息的设置出现了问题。在读入为空时,将唤醒电梯,随后设置结束信号为真。(这实际上就是和第二次作业一模一样的,所以第二次作业存在着问题,只是没有被发现,或者说出现的概率极低)将其更改为先设置结束信号为真,再唤醒电梯即可。
2.关于强测中的炸点问题,出现原因是存在隐式小轮询,第二部电梯会在中转楼层反复判断该请求id是否到达,添加了wait和notify即可解决。
3.关于run方法过长,应该考虑将run中内容打包为方法,在run中直接进行调用即可。
4.关于优化,最初的设想中,将所有可以达成该目的的调度方法分别对用存入到三台电梯各自的请求队列里,但实际情况极为复杂,例如3到-2,包含了C转A和C转B两种情况,在中弱测中,我的调度会将该id进行两次的入电梯C,想要继续进行修改过于复杂,而且即便进行修改,又不知是否会有其他的错误出现,在时间不足的情况下,只好修改为每个id仅有唯一的乘电梯方式。同时,这也告诉了我,在写代码前,一定要有严格的设计,可以减少时间。
oo第二单元的自白的更多相关文章
- oo第二单元作业总结
oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...
- OO第二单元优化博客
OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
- OO第二单元小结
OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...
- OO第二单元多线程电梯总结
OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...
- 电梯也能无为而治——oo第二单元作业总结
oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...
- 2020北航OO第二单元总结
2020北航OO第二单元总结 前言 本单元考察基于多线程的电梯调度问题,成功让我从一个多线程小白到了基本掌握了使用锁来控制线程安全的能力,收获颇多(充分体验了迷茫地de一个又一个死锁bug的痛苦). ...
- OO第二单元——多线程(电梯)
OO第二单元--多线程(电梯) 综述 第二单元的三次联系作业都写电梯,要求逐步提高,对于多线程的掌握也进一步加深.本次作业全部都给出了输入输出文件,也就避免了正则表达式判断输入输出是否合法的问题. 第 ...
- OO第二单元作业总结【自我反思与审视】
第二单元作业的完成史,就是一部心酸的血泪史…… 多线程的出现为我(们)打开一片广阔的天地,我也在这方天地摸爬滚打,不断成长!如果说第一单元之前还对Java语法有所了解的话,那么这单元学习多线程则完全是 ...
随机推荐
- Mnist
Mnist 先贴一个介绍的很好的博客 https://blog.csdn.net/sysushui/article/details/53257185 mnist是一个手写体数字的数据集.上图是数据集的 ...
- 使用tcpreply对DPDK进行压力测试(一台主机,2张网卡压测)
使用tcpreply对DPDK进行压力测试 过往风萤 关注 2018.05.18 14:35* 字数 273 阅读 2评论 0喜欢 0 小公司没有testcenter之类的打流工具,并且内网流量比较小 ...
- node.js 使用NAPI写C++插件,(部分转帖)
原文:https://www.cnblogs.com/chyingp/p/nodejs-learning-napi.html 可能是版本问题,我用node v10.6.0 遇到了问题 不过解决了. 一 ...
- python爬虫-上期所持仓排名数据爬取
摘要:笔记记录爬取上期所持仓数据的过程,本次爬取使用的工具是python,使用的IDE是pycharm 一.查看网页属性,分析数据结构 在浏览器中打开上期所网页,按F12或者选择表格文字-右键-审查元 ...
- 【机器学习】主成分分析法 PCA (I)
主成分分析算法是最常见的降维算法,在PCA中,我们要做的是找到一个方向向量,然后我们把所有的数都投影到该向量上,使得投影的误差尽可能的小.投影误差就是特征向量到投影向量之间所需要移动的距离. PCA的 ...
- JavaScript RegExp(正则)
第一种方式是直接通过/正则表达式/写出来,第二种方式是通过new RegExp('正则表达式')创建一个RegExp对象. 两种写法是一样的: var re1 = /ABC\-001/; var re ...
- Fiddler功能介绍之Web抓包、远程抓包教程【转载】
一.fiddler简介 简单来说,Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯.网上简介很多,我们不多说. 二.fiddler版本 fiddle ...
- Win7 VS2017编译Godot3.0.2和2.1.4
千呼万唤屎出来,Godot终于发布3.0版本的源码了,今天是2018年3月17日,自去年接触过后,一直没事就刷刷Gayhub,看看3.0什么时候更新,刷了一年也没结果. 今天上Youtube无意中搜了 ...
- (转)支持 PS/2 与 USB 的键盘过滤驱动(可卸载)
Author: sinisterEmail: sinister@whitecell.orgHomepage:http://www.whitecell.org Date: 2007-02-2 ...
- PowerShell工作流学习-6-向脚本工作流添加检查点
关键点: a)检查点是工作流当前状态的快照,其中包括变量的当前值以及在该点生成的任何输出,这些信息保存在磁盘. b)检查点数据保存在托管工作流会话的计算机的硬盘上的用户配置文件中. c)当工作流通用参 ...