OO第二单元小结
OO第二单元小结
一.三次作业代码分析。
1.第一次作业
第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果输入空则退出,否则将这条命令交给电梯去run,而电梯需要做的事情就是从当前楼层去接人,然后将之送达目的地即可。第一次作业基本没有使用多线程的思想,但是正确性是无懈可击的。
其实为了学习和使用多线程知识,我也写了一个多线程版本的傻瓜调度,其设计与第二次作业几乎相同,不同点就只在电梯的运行方法上有所不同。
类图:
度量分析:
2.第二次作业
第二次作业相比第一次作业增加了电梯的捎带,电梯需要实时根据自己的状态来判断是否有可以捎带的命令在请求队列之中。所以第二次作业不能使用第一次作业的方法,于是我便开始了灾难性重构。
这次作业使用了5个类,main类负责构建输入流线程和调度器线程,两个线程共享一个请求队列;调度器创建电梯线程,并且和电梯共享一个待执行命令队列。由于只有一部电梯,所以调度器要做的事情就是当请求队列不空,则拿出一条命令放到电梯线程的待执行命令队列之中,使用sleep加轮询的方式防止cpu超时。电梯要做的事情就是,根据待执行队列中的命令和自身状态来进行接送乘客的操作。因为将电梯如何运行的操作全部放在了电梯线程之中,所以电梯类有些臃肿。
类图:
度量分析:
3.第三次作业
第三次作业相比第二次作业,就是多了两部电梯和电梯有一定的停靠规则以及运行时间上的差异。但是由于第二次作业构建得比较成功,所以第三次作业我做的相对轻松(正确性),只需要在调度器线程中再开两部电梯,调度器根据一定的算法来分配命令,不能直接送达的命令则拆分成两个部分,第二部分放到新建的单例模式类的请求队列之中,用来管理第二部分指令,每当电梯到达某一楼层有人出来之时,就在该单列出来的队列之中遍历有无相同id的命令,有的话则将之从该队列之中删除,并且将之加入到输入流和调度器线程所共用的那个请求队列之中,等待调度器进行下一次分配即可。
类图:
度量分析:
二.BUG分析
第一次作业
(1)由于采用了简单暴力的解法,所以第一次作业没有bug。
第二次作业
(1)电梯状态的初始化没做好,导致会有人还没有进来就出去的错误。
第三次作业
(1) 第三次作业多了一个第二部分请求队列,所以一开始判断结束条件时少了判断第二部分请求队列是否为空,导致进程不能正常结束。
三.互测攻略
这三次作业,我每一次都是将每个人的src放在不同的包中,先大致浏览一下代码,然后一个一个进行手动测试,测试的数据是自己课下以及在互测阶段出过bug的数据、自己构想的一些边界数据以及电梯第一次作业中的强测数据,在电梯第二次作业中取得了比较好的hack效果。
四.反思与总结
总地来说,三次作业的难度区分度还是有的,在逐步完成作业的过程中,我其实遇到了很多线程安全上的问题,主要原因在于对wait和notify还理解得不够透彻,所以还是采用了sleep加轮询的方法来消除忙等待导致的cpu超时,以及使用JAVA自带的线程安全的CopyOnWriteArrayList和一些synchronized方法来避免线程不安全,是属于比较笨拙但是却有效的方法来解决安全问题。
其实,性能方面也是我要惭愧的一个地方,由于能力有限,每次作业我以正确性为最高目标,完全没有考虑架构的优化潜力,这最终导致我的强测分数并不好看。但是正如助教所说,不必为了性能而大开倒车。冒着风险去做不太符合现实场景的优化(预测未来什么的),不仅仅是因为要花费的时间很多,而且我也不太愿意去做和现实实际场景不太相符的优化。但是抛开现实场景,我觉得学习优化的方法还是对自己大有卑益的,所以我以后会尽量改变自己的态度。
OO第二单元小结的更多相关文章
- OO第二单元の小结
第二单元(线程与电梯问题)总结博客 三次作业的设计策略 第一次:本次作业只有一部电梯,而且不用捎带.因此,我一共设计了两个线程:一个负责管理输入,一个负责电梯运行.同时,我将调度队列设置为单例模式,里 ...
- oo第二单元作业总结
oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...
- OO第二单元优化博客
OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
- OO第二单元多线程电梯总结
OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...
- 电梯也能无为而治——oo第二单元作业总结
oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...
- 2020北航OO第二单元总结
2020北航OO第二单元总结 前言 本单元考察基于多线程的电梯调度问题,成功让我从一个多线程小白到了基本掌握了使用锁来控制线程安全的能力,收获颇多(充分体验了迷茫地de一个又一个死锁bug的痛苦). ...
- OO第二单元——多线程(电梯)
OO第二单元--多线程(电梯) 综述 第二单元的三次联系作业都写电梯,要求逐步提高,对于多线程的掌握也进一步加深.本次作业全部都给出了输入输出文件,也就避免了正则表达式判断输入输出是否合法的问题. 第 ...
- OO第二单元作业小结
前言 转眼已是第九周,第二单元的电梯系列作业已经结束,终于体验了一番多线程电梯之旅. 第一次作业是单电梯的傻瓜调度,虽然是第一次写多线程,但在课程PPT的指引下,写起来还是非常容易:第二次作业是单电梯 ...
随机推荐
- 转载及总结:cron表达式详解,cron表达式写法,cron表达式例子
cron表达式格式:{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}例 "0 0 12 ? * WED" 在每星期三下午12:00 执行(年份通常 ...
- 在windows 10 上使用aspnet_regiis.exe -i 命令报 “此操作系统版本不支持此选项” 的解决办法
用CMD窗口在C:\Windows\Microsoft.NET\Framework64\v4.0.30319下使用命令aspnet_regiis -i 报错: “此操作系统版本不支持此选项” .结果是 ...
- C# ADO.NET中设置Like模糊查询的参数
ADO.NET进行参数化时会自动将参数值包含在单引号中,除了特殊需求,最好不要自己手动添加单引号.ADO.NET中识别参数标识是使用符号@,如果在SQL语句中将参数标识放在单引号中,单引号中的参数标识 ...
- python各种web框架对比
0 引言 python在web开发方面有着广泛的应用.鉴于各种各样的框架,对于开发者来说如何选择将成为一个问题.为此,我特此对比较常见的几种框架从性能.使用感受以及应用情况进行一个粗略的 ...
- javascript判断字符串相等
- ReactiveX 学习笔记(28)使用 RxJS + React.js 进行 GUI 编程
课题 程序界面由3个文本编辑框和1个文本标签组成. 要求文本标签实时显示3个文本编辑框所输入的数字之和. 文本编辑框输入的不是合法数字时,将其值视为0. 3个文本编辑框的初值分别为1,2,3. 创建工 ...
- Linux网络编程学习(八) ----- 文件和记录锁定(第四章)
1.什么是文件和记录锁定? 文件锁定的是整个文件,而记录锁定只锁定文件的一部分,文件和记录锁分为咨询式锁定和强制锁定 1)咨询式锁定 某个进程对某个文件进行了咨询式锁定,其他想访问该文件的进程将会被操 ...
- 虚拟机安装及ubuntu-16.04.3-desktop-amd64.iso映像文件的安装
虚拟机安装及ubuntu-16.04.3-desktop-amd64.iso映像文件 搞了大半天才搞清楚装linux的前提是要先安装虚拟机的 先下载虚拟机,在然后创建虚拟机,在虚拟机里面再安装linu ...
- Java实现微信客户端扫码登录
此篇文章记录自己开发中的微信客户端扫码登录的实例以及步骤,便于以后自行学习记起的关键,看到的网友有借鉴的地方就借鉴,看不懂的也请别吐槽,毕竟每个人的思维和思路以及记录东西的方式不一样: 1.首先需要一 ...
- SSM商城项目(十一)
1. 学习计划 1.sso注册功能实现 2.sso登录功能实现 3.通过token获得用户信息 Ajax跨域请求(jsonp) 2. Sso系统工程搭建 需要创建一个sso服务工程,可以参考e ...