还记得前三次的设计策略:星期二之前实现功能,星期三找一下可能出现的小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生存指.....抱歉无法生存的更多相关文章

  1. 颓废选手在 Ubuntu/Noilinux 下的生存指北

    颓废选手在 Ubuntu/Noilinux 下的生存指北 Hint: 这里的 "#" 都是假注释,复制的时候记得删除 一些基本的生存命令 ctrl + alt + t #调出终端 ...

  2. 生存分析与R--转载

    生存分析与R 生存分析是将事件的结果和出现这一结果所经历的时间结合起来分析的一类统计分析方法.不仅考虑事件是否出现,而且还考虑事件出现的时间长短,因此这类方法也被称为事件时间分析(time-to-ev ...

  3. R语言学习 - 非参数法生存分析--转载

    生存分析指根据试验或调查得到的数据对生物或人的生存时间进行分析和推断,研究生存时间和结局与众多影响因素间关系及其程度大小的方法,也称生存率分析或存活率分析.常用于肿瘤等疾病的标志物筛选.疗效及预后的考 ...

  4. 生存分析(survival analysis)

    一.生存分析(survival analysis)的定义 生存分析:对一个或多个非负随机变量进行统计推断,研究生存现象和响应时间数据及其统计规律的一门学科. 生存分析:既考虑结果又考虑生存时间的一种统 ...

  5. 生存分析与R

    生存分析与R 2018年05月19日 19:55:06 走在码农路上的医学狗 阅读数:4399更多 个人分类: R语言   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...

  6. 泰坦尼克(Titanic)生存因素可视化

    数据来源: kaggle 分析工具:Python 3.6 & jupyter notebook 附上数据:链接: https://pan.baidu.com/s/1D7JNvHmqTIw0Oo ...

  7. 通过jd2chm工具将html文档生存chm文档方法

    1.下载jd2chm.exe工具 2.下载后解压缩后先安装htmlhelp.exe 3.将jd2chm.exe文件拷贝到index.html所在文件夹中 4.打开命令行进入到index.html所在文 ...

  8. Java基础常见英语词汇

    Java基础常见英语词汇(共70个) ['ɔbdʒekt] ['ɔ:rientid]导向的                             ['prəʊɡræmɪŋ]编程 OO: object ...

  9. 看到了必须要Mark啊,最全的编程中英文词汇对照汇总(里面有好几个版本的,每个版本从a到d的顺序排列)

    java:  第一章: JDK(Java Development Kit) java开发工具包 JVM(Java Virtual Machine) java虚拟机 Javac  编译命令 java   ...

随机推荐

  1. JS json字符串转对象、对象转字符串

    JSON是javascript原生格式,在JavaScript中处理json数据不需要任何特殊的API或者工具包. JSON中,有两种结构:对象和数组. 在数据传输流中,json是以文本,即字符串的形 ...

  2. EOS智能合约开发(四):智能合约部署及调试(附编程示例)

    EOS智能合约开发(一):EOS环境搭建和创建节点 EOS智能合约开发(二):EOS创建和管理钱包 EOS智能合约开发(三):EOS创建和管理账号 部署智能合约的示例代码如下: $ cleos set ...

  3. MySQL高性能优化实战总结!

    1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多 ...

  4. c/c++ lambda 表达式 剖析

    lambda 表达式 剖析 大前提:捕获列表里变量的确定时机. 捕获列表和参数列表有区别,捕获列表里的变量,是在捕获的时间点就确定了,而不是在lambda调用时确定,参数列表是在调用时才确定.所以当捕 ...

  5. python编写文件统计脚本

    python编写文件统计脚本 思路:用os模块中的一些函数(os.listdir().os.path.isdir().os.path.join().os.path.abspath()等) 实现功能:显 ...

  6. 搭建windows测试环境的步骤

     步骤:1.JDK安装 2.配置好JDK环境变量3.Tomcat安装4.将war包放在Tomcat的发布目录中webapps中,5.conf>server.xml里面设置默认解压,unpackW ...

  7. 如何写 go 代码 (How to Write Go Code 翻译)

    目录 1. 写在前面的话 2. 介绍 3. 代码组织 3.1. 工作区 3.2. GOPATH 环境变量 3.3. Package 路径 3.4. 第一个 GO 程序 3.5. 第一个 GO 库 3. ...

  8. Windows下mysql服务的安装与卸载

    安装 mysqld -install 也可以指定mysql安装服务的文件 my.ini文件配置好后就可以在cmd中安装mysqld服务了,在cmd中运行命令:mysqld --install MySQ ...

  9. python requests简介

    更为强大的库requests是为了更加方便地实现爬虫操作,有了它 , Cookies .登录验证.代理设置等操作都不是 . 一.安装requests模块(cmd窗口执行) pip3 install r ...

  10. spark program guide

    概述 Spark 应用由driver program 组成,driver program运行用户的主函数,在集群内并行执行各种操作 主要抽象RDD: spark提供RDD,是贯穿整个集群中所有节点的分 ...