还记得前三次的设计策略:星期二之前实现功能,星期三找一下可能出现的小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 ...
随机推荐
-
Android+PHP服务器+MySQL实现安卓端的登录
时隔已久的一个任务,今天终于可以画上一个句号了.心情是万分的激动,虽然这份小成就来的有点迟但还是按捺不住心情的澎湃.下面我就先上几张图片来展示一下我的成绩 android源代码: 首先最重要的一件事是 ...
-
给定金额m和红包数量n
这一题如果是采用暴力手段,不一定能获得正确答案,而且也非常耗时. 所以下面我们采用一个小技巧,也就是先产生n-1个红包,总得sum<m的,这样最后只要添加一个sum-m的红包钱数就可以了. 具体 ...
-
Typora极简教程
Typora极简教程 ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易读易写的纯文本格式编写文档,然后转换成有效的 HTML 文档.” ...
-
JarvisOJ Misc 炫酷的战队logo
欣赏过了实验室logo,有人觉得我们战队logo直接盗图比较丑,于是我就重新设计了一个,大家再欣赏下? 一开始拿到的BMP文件就打不开,用010打开发现文件头被抹去了,补上了BMP,与文件大小后,发现 ...
-
vsCode---中文化
一直使用的是webStorm这个工具,不过由于这个工具不是那么的方便:比如我平时只是想新建一个html页面来编写一些js代码,以便测试自己的想法. 但是webStorm这个工具需要新建项目然后npm运 ...
-
timescaledb 集成 madlib
github 上有人提出了一个问题(2017 很早了),然后搜索timescaledb 的docs 文档,发现有 一片介绍的文章,所以尝试运行下 备注: 环境使用虚拟机安装(没有使用docker ma ...
-
linux 协议栈tcp的rst报文中,seq的选取问题
之前在<深入理解并行编程>的群里,有个小米的兄弟问了一个问题,服务器A发包给服务器B,Seq是1,但是在未能收到服务器B的报文回复的情况下,发送了rst,但是rst报文中,对应的seq是1 ...
-
RadioButtonList根据值触发OnSelectedIndexChanged事件
Insus.NET有使用Iframe来处理另外一个站点的enter form,由于需要自动循环填入数据,免去人手操作.但是原来的Enter from有RadioButtonList控件以及OnSele ...
-
<;constant name=";struts.devMode"; value=";false"; />;
在开发中,我们常常会遇到<constant name="struts.devMode" value="false" />,这是struts2的特性, ...
-
2017多校第8场 HDU 6138 Fleet of the Eternal Throne 思维,暴力
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6138 题意:给了初始区间[-1,1],然后有一些操作,可以r加上一个数,l减掉一个数,或者同时操作,问 ...