OO生存指.....抱歉无法生存
还记得前三次的设计策略:星期二之前实现功能,星期三找一下可能出现的小bug。
这三次以及变成了:星期二之前能跑出来就行。
总体来说设计策略是:先让几个线程能够顺利运行,再开始实现功能。
在接触到多线程之后,我已经没有前三次作业的余裕了(虽然前三次也不怎么有)。
还生存个鬼嘞,不无效就行了吧 = =
第五次作业:多线程电梯(三电梯)
听说是所有作业中最难的一次了,事实上也完全对得起这个名号。这次作业对设计架构,线程安全的要求都是相当高的。而且对于测试来说,因为三线程电梯的随机性实在不高,测试时很明确,也提升了这次作业写出来的难度。比起来之后的出租车随机性更高一点,当然没有电梯这么难设计了。
放在第五次的理由,大概一是有足够的时间清明假期(不让好好的过清明),二是有个单线程电梯的基础。但是我还是觉得放在第五次不太妥当,毕竟让一个完全没接触过线程的人,一个星期的时间写出来这样的一个工程实在要求太高。而且像我这种菜鸡,在这么短时间,要理解线程,线程安全和同步之类的可以说是天方夜谭了。
事实上在这次作业之前我完全没想过能够一星期“速成”JAVA多线程,好在最后牺牲了不少的睡眠时间是做出来了,虽然时间太紧做的也不怎么样。
设计策略:
多线程按照指导书设计,三个电梯各一个线程,调度器一个线程,输入一个线程。
这次比起第三次ALS的电梯改动还是挺大的,最明显的是调度器不再是一个GOD类,电梯的运动也是分配给了elevator类。
然而说起来容易,实施起来确是无比困难。
首先是我对线程完全不清楚,全靠速成。以致于刚开始跑的时候,一度因为while(true) 而卡死,eclipse崩溃,CPU的占用率100%。
其次知道了线程不能直接这样,使用了wait来使线程停止,具体说来即让调度器在请求队列为空时停止工作。
另外对每一个电梯都构造了一个请求队列,电梯直接根据这个队列来跑即可。所以这次作业,在相互的睡眠与唤醒,花了不少功夫。另外这样会有很多共有元素,因此线程安全也很重要。为了解决输入END停止线程,我甚至还特地开了个类传递参数。
最后在调度上一度出现问题,最后发现是根据电梯状态来判断分配延迟太大,又来改分配。在星期三下午还临时改了分配掉地策略。导致最后出来了很多之前没有,意想不到的bug。
回首起来这次作业真是一次惨痛的经历,也是多线程痛苦的开始。
度量分析:
类图:
使用ctrl + 滚轮 获取最佳观赏效果。
协作图:
可以看出来,度量分析有三个点飘红了。
圈复杂度和嵌套复杂度很高,这也是情理之中的。毕竟这个sendInLine方法大部分是沿用上次的电梯的,上次都飘红了,然而并没有时间来优化上次代码,这次飘红也正常。
另一个点是类的属性过多。问题出在调度器类中,传了不少参数。
但是在这次难度的重压下,对于我这个菜鸡来说,优化实在不大现实,毕竟debug就要花上不少时间。在bug都无法解决的情况下没办法去面对优化和设计原则的。
所以写完之后,缺点一大堆,bug多而且设计也不好。唯一的优点可能就是写出来了。
BUG总结:
自己的bug:一堆
时间有误差(还好公测没有出现),这个实在很难避免,在时间不足的情况下我也没办法处理了。
同层应该捎带未捎带,多开了一次门。
STILL状态下不能捎带。
上述两条是因为我开始按照电梯状态来判断捎带,出问题后,临时改成按照另外的方式,但是没有测试,所以出现了bug。
ER请求有一个捎带不上,不知道原因,可能是因为锁?
下家的bug:也是一堆,还更多
公测运动量没有按照最小的来分配。
同质请求判断出了问题。
同层请求多于一条,捎带不上。这个是因为按照电梯状态判断,中间有时间误差,对于同时输入的请求无法及时正确分配。
此外还出现了一个crash,是线程中出现了问题。
测试策略什么的,不存在的,毕竟随便一找就是一堆bug。
第六次作业:IFTTT(文件监控器)
最迷的一次,比多线程电梯还迷。
如果说多线程电梯在星期一已经大致跑出来多线程只是bug很多,这次IFTTT在星期一连个架构都没有,在星期二才能大致跑出来。晚上一边听凉凉一边写完了。
虽然难度不及多线程电梯,但是时间紧迫,而且指导书不知所云,光是理解指导书就要费不少功夫。
这次作业说是训练对线程安全的应用,实际上写完之后,除了一个SafeFile类,根本没发现线程安全在哪里有应用。对线程安全的要求,比上次多线程电梯差远了,甚至比不过出租车。所以完全不能理解这次作业的意义何在。干脆说是对文件类的训练完全不为过。
另外希望下届这次作业指导书能更清晰,不要朝令夕改,毕竟星期三下午还要改需求让我们还是挺难受的,做好测试时候测试点和设计需求的平衡,最好直接删除IFTTT这次作业。
设计策略:
输入一个线程,每一个 “触发器-任务” 对 对应一个线程,即为每一个监视器开一个线程,最多可能100个。
此外为detail和summary单开了两个线程。
线程安全问题,发现只要用的是SafeFile,不会因为线程安全而出错,出错的只可能是实现上的。
所以最困难的还是实现,线程安全我基本上没注意到然而也没有出问题。
度量分析:
类图:
使用ctrl + 鼠标上滚轮获取最佳观赏效果。
协作图:
飘红的点是圈复杂度和嵌套深度,全部出在rename方法上(除了这个方法估计就是path-changed方法)
因为一个方法中涉及的太多。这也跟设计策略有关,因为每一个线程对应的一种方法。除此之外,快照snapshot也在方法中进行,因此这圈复杂度和嵌套深度都很高。
BUG总结:
虽然自己感觉写的不是很好,应该会有bug,然而实际被测试中并未被找到bug,也是很值得高兴的。
测试下家过程发现了两个bug,公测发现监控文件夹renamed的recover无法恢复,在监控文件夹path-changed的recover也无法恢复。另一个bug是监控文件夹modified,在size-changed同时不会触发。
至于测试策略,按树测吧。毕竟除了树也没什么好测的。(树上的也不能全部测完)
第七次作业:傻瓜出租车
听说是简单了,然而实际上动手的时候发现自己又被骗了。
不过比起最难的多线程电梯,以及最迷的IFTTT来看,确实是简单了点。虽然没简单到比前三次简单就是了。
整体思路和架构因为有了多线程电梯,看起来不是那么困难了。而且实现上因为有随机性,所以更不会跟电梯一样有明确的bug可寻。
但是花的时间并没有减少太多。。。。。
设计策略:
完全按照电梯的思路,输入一个线程,调度一个线程,此外把100个出租车单开一个线程。
这次调度比电梯简单的原因是分配任务后没捎带,也就是说不必再考虑出租车的调度,直接让出租车运行即可。不会像电梯一样,分配了任务之后,电梯还要考虑到自己被分配的任务来运行。
设计看起来不太难,主要还是实现部分。
度量分析:
类图:
使用ctrl + 鼠标上滚轮获取最佳观赏效果。
协作图:
第一个飘红的点圈复杂度来自GUI ? 就不做评述了。
后面嵌套深度过深来自run方法,应该是scheduler的run方法。这块写的太复杂了导致飘红。
这次因为有设计原则的限制,在设计上稍微下了点功夫。因此自我评价还行。
BUG总结:
己方唯一bug还是时间的误差,无法做到很精确的200ms,感觉要实现还是很困难的。
对方的bug除了我的之外,还有加信用时间没有做到与指导书相同。
这次的测试策略还是按照树测,因为随机性太高,找不到其他测试方法。
心得与体会:
1.先说下收获。从清明之前,完全不知道多线程为何物,在寝室啃着教程学习多线程,到如今已经能写出三个多线程程序,要说心里面没有点成就感是不可能的。
最大的收获就是对多线程有了一定的理解,不像一开始一样,漏洞百出,什么都不会,写一段代码能把电脑炸半天。现在不仅能写出来多线程程序,对多线程的debug也有计可施。也对多线程安全有了一定理解。
2.对于线程安全的理解,不仅仅只是用synchronized简单锁一下方法,一开始用这个方法在debug过程中吃了不少亏。何时synchronized,何时wait,何时notify,需要开始就有一个大体的把握。
3.所以在设计线程的时候就要考虑好线程同步问题,不然debug会有苦头吃。
4.至于设计原则,虽然在开始几次比较困难的时候,真的是没有时间来考虑自己的设计。但是在还算充足时间的出租车上,一个好的设计作用还是很大的。
5.有得也有失。失去的睡眠时间和头发当然微不足道,真正令我心痛的是失去的其他课程的时间。因为花了太多时间在oo上,os前一天基本没有时间复习os的理论,实验也只是粗略的看看。导致os第二天的考试一塌糊涂,三次实验上机挂了两次,这是让我最遗憾的。希望后来人能协调好oo与os的时间。也希望oo的课业压力能够小一点点,熬夜真的不算什么,但是我真的不希望os挂科。。。。。
6.....大概不算一点吧
感觉Avicii的waiting for love 挺符合oo的意境的
Monday left me broken
Tuesday I was through with hoping
Wednesday my empty arms were open
Thursday waiting for love, waiting for love
希望之后的测试者都能满怀爱心
OO生存指.....抱歉无法生存的更多相关文章
- 颓废选手在 Ubuntu/Noilinux 下的生存指北
颓废选手在 Ubuntu/Noilinux 下的生存指北 Hint: 这里的 "#" 都是假注释,复制的时候记得删除 一些基本的生存命令 ctrl + alt + t #调出终端 ...
- 生存分析与R--转载
生存分析与R 生存分析是将事件的结果和出现这一结果所经历的时间结合起来分析的一类统计分析方法.不仅考虑事件是否出现,而且还考虑事件出现的时间长短,因此这类方法也被称为事件时间分析(time-to-ev ...
- R语言学习 - 非参数法生存分析--转载
生存分析指根据试验或调查得到的数据对生物或人的生存时间进行分析和推断,研究生存时间和结局与众多影响因素间关系及其程度大小的方法,也称生存率分析或存活率分析.常用于肿瘤等疾病的标志物筛选.疗效及预后的考 ...
- 生存分析(survival analysis)
一.生存分析(survival analysis)的定义 生存分析:对一个或多个非负随机变量进行统计推断,研究生存现象和响应时间数据及其统计规律的一门学科. 生存分析:既考虑结果又考虑生存时间的一种统 ...
- 生存分析与R
生存分析与R 2018年05月19日 19:55:06 走在码农路上的医学狗 阅读数:4399更多 个人分类: R语言 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...
- 泰坦尼克(Titanic)生存因素可视化
数据来源: kaggle 分析工具:Python 3.6 & jupyter notebook 附上数据:链接: https://pan.baidu.com/s/1D7JNvHmqTIw0Oo ...
- 通过jd2chm工具将html文档生存chm文档方法
1.下载jd2chm.exe工具 2.下载后解压缩后先安装htmlhelp.exe 3.将jd2chm.exe文件拷贝到index.html所在文件夹中 4.打开命令行进入到index.html所在文 ...
- Java基础常见英语词汇
Java基础常见英语词汇(共70个) ['ɔbdʒekt] ['ɔ:rientid]导向的 ['prəʊɡræmɪŋ]编程 OO: object ...
- 看到了必须要Mark啊,最全的编程中英文词汇对照汇总(里面有好几个版本的,每个版本从a到d的顺序排列)
java: 第一章: JDK(Java Development Kit) java开发工具包 JVM(Java Virtual Machine) java虚拟机 Javac 编译命令 java ...
随机推荐
- 洗礼灵魂,修炼python(74)--全栈项目实战篇(2)——前期准备之详解虚拟机下安装ubuntu,基本配置,远程访问
如果上一篇我转发的关于ubuntu的博文,你看完觉得还没准备好,那么,本篇从最基础的开始,安装虚拟机到正常使用ubuntu 虚拟机 1.什么是虚拟机 虚拟机(Virtual Machine)指通过软件 ...
- c/c++ 标准库 插入迭代器 详解
标准库 插入迭代器 详解 插入迭代器作用:copy等函数不能改变容器的大小,所以有时copy先容器是个空的容器,如果不使用插入迭代器,是无法使用copy等函数的. 例如下面的代码就是错误的: list ...
- 第八章 Hyper-V 2012 R2 故障转移群集
和终端用户相比,企业用户对于业务的连续性和可靠性更为在意.相对而言,企业一般不会将追逐单一硬件的性能排在第一位. 如何衡量业务是否持续可用,一般使用"x 个 9"这种方式来定义.如 ...
- C# -- 接口 (关键字:interface)
C#: 接口(关键字:interface) 1.代码(入门举例) class Program { static void Main(string[] args) { Console.WriteLine ...
- vCenter server 的部署和实施
上一次我们讲解了vclient 5.5 的安装以及连接ESXI5.5,但vclient只能管理一台ESXI,管理多台还需要切换登陆,非常麻烦.所以这次我们就来讲解一下vcenter server的相关 ...
- MATLAB简易画图2—普通直角坐标系
MATLAB简易画图2—普通直角坐标系 本人的MATLAB版本为: 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 继续在“MATLAB简易画图”这篇随 ...
- MYSQL的binlog日志
binlog 基本认识 MySQL的二进制日志以事件形式,记录了所有的DDL和DML(除了数据查询语句)语句,及语句执行消耗时间. MySQL的二进制日志是事务安全型的,是MySQL最重要的日志. b ...
- PostgreSQL 数据库NULL值的默认排序行为与查询、索引定义规范 - nulls first\last, asc\desc
背景 在数据库中NULL值是指UNKNOWN的值,不存储任何值,在排序时,它排在有值的行前面还是后面通过语法来指定. 例如 -- 表示null排在有值行的前面 select * from tbl or ...
- C. Queen Codeforces Round #549 (Div. 2) dfs
C. Queen time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...
- 实战Performance Monitor监测EnyimMemcached
首先要将EnyimMemcached安装至Windows Performance Counters中. 将Enyim.Caching.dll复制到一个文件夹中 在命令行中进入.NET Framewor ...