OO第二次博客作业(2018春)

写在前面

多线程

搞死人


第五次作业

类图:

  这次作业的调度器(als_3_controller)继承了上一次的调度器(smart_controller),并且分解了之前的schduel方法,内容分布在run()和新建的类ELE_thread的isCarry()和run()里。在程序运行启动了类ELE_thread 的三个线程,分别代表三部电梯的控制系统,分别操作三部电梯。

度量分析:

  问题都出在ELE_thread 的run()里,包括圈复杂度和嵌套深度。主要是因为把上一次的大部分代码都集中放到了run方法里,代码冗杂,重复的部分多,聚合和耦合情况也不理想。

时序图:

BUG分析:

  又犯拖延症的我,花在这次作业上的时间并不多,大部分代码都是在上一次的基础上改动,对多线程的理解也不好,所以这次作业Bug满满:

  1.没输出到文件。第一次用java对文件读写,有点生疏。

  2.两次调度同一请求。多线程同步控制没写好,一个请求进到了两部电梯的队列里。

  3.FR没捎带。捎带判断条件出了问题。

  4.电梯选择错误。累积量的累积滞后,导致本不应被选择的电梯被选择。

  还有茫茫多bug,上面是摘选的典型的几个。互测公测加起来大概有十多个,但测的同学特别nice,友好交流后帮我删了几个。

第六次作业

类图:

  这一次作业主要的两个类是monitor类和SafeFile类。其中SafeFile类把File类封装成一个线程安全的文件类,我的主要做法就是在方法前加关键字synchronize。而monitor类则负责分析每个请求,判断是否触发并通知几个任务类执行任务。在设计思路上,对于每个请求,我都启动了一个线程去分析它。这样的做法,让monitor的写法更加清晰,但很浪费资源。

度量分析

  圈复杂度和嵌套快深度超标在monitor的run方法里。在设计的时候,几乎把monitor要实现的所有功能都放到了run方法里,嵌套层数很多。而且我在处理监控文件和监控目录时,把它们分别放到了一个if-else语句里,两部分内容大致相同,导致代码重复。也由于上面的问题,代码的内聚程度不好。

时序图:

BUG分析:

  这次作业花了很长时间,但还是出现很多Bug,原因还是对多线程的协调理解得不透彻(绝望脸orz):

  1.rename部分情况未触发。当当前目录下有更深层目录时,renanme不触发,原因是递归遍历深层目录时,当不是文件时返回值出错。

  2.path-changed部分情况未触发。当当前目录下有更深层目录时,path-changed不触发,原因是递归遍历深层目录时,当不是文件时返回值出错。

  3.rename recover后无法再rename。rename追踪文件出错。

  由于黑盒测试的问题,这次作业中的一个bug(递归遍历深层目录)被挂了分支树上包括互测公测的七个bug。再加上其他几个零碎bug,这次同样被扣了一大波分。

第七次作业

类图:

  第七次作业是出租车的第一次作业,几个主要的实现功能的类是taxi,schduel,Map和GUI。taxi类定义了单个出租车,负责出租车的各种行为,包括停止、等待、闲逛、接客等,在其中的run方法里规定了一个出租车在几种状态下转换过程。schedule类接收到乘客请求后,负责分析请求,为每个乘客开辟等待窗口,选择合适的出租车并通知它接送乘客。Map类主要负责用几种不同的数据结构初始化并储存地图。GUI负责将可视化。在设计思路上,为每个出租车和每个乘客请求都新开启一个线程,比较浪费资源,有待改进。

度量分析:

  只有圈复杂度超标,除了GUI,schedule中的run()和taxi中的sortPath()都被标红了。schedule中的run()中实现了开辟窗口和选择出租车两部分,代码有些复杂。taxi中的sortPath()是一个寻找最短路径的方法,由于采取了Dijkstra算法,代码比较长。

时序图:

BUG分析:

  可能是这次对面的同学没怎么测我,互测没有bug和设计缺陷(虽然我知道自己还有一大堆问题...)。

  自己在测试的时候,发现100辆出租车在同时停止时,有时候会有几辆有延迟。

心得体会

  听学长说,写到多线程才能叫oo,当时我就心里一凉。经过这几次作业的洗礼,发现学长说的真有道理。经过这几次作业的洗礼,也有一些体会和大家分享:

  1.分清实例有几个线程共享

  2.多线程共用一实例,实例内所有全局变量不安全,需要同步方法改变全局变量值。

  3.单线程用一实例,实例内所有非静态的全局变量安全。

  4.对同步块的领悟:同步块同步的是对象,也可以说同步对象中的内存地址,也即同步对象中的全局变量,防止多线程不安全的访问同一对象的内存地址即不安全的访问同一对象的全局变量。

  5.注意静态全局变量和非静态全局变量的区别

  6.千万不要抱着可以在上次作业的基础上改改就行的侥幸心理,一定要重写!

  对于线程的分析,线程之间的协作,同步控制的理解还不到位,以后多努力!



道阻且长~

原文地址:https://www.cnblogs.com/wjy12138/p/8981891.html

时间: 2024-08-27 12:00:32

OO第二次博客作业(2018春)的相关文章

OO第二次博客作业

一.第五次作业--多线程电梯 (1)分析: 因为时间比较紧迫,所以采用了伪多线程的方式,即计算还是单线程,但是输出是三个多线程.不过最后被判无效了,GG. 现在分析一下觉得还是挺清晰的,电梯开三个线程,在分派任务的时候wait,notify一下就行了. 算法分析: 1.每个电梯有一个list队列,在新任务来的时候决定加入哪个list 2.有变动的list更新(用上一次的代码,从头算到尾,得到应该输出的真实时间) 3.三个线程死循环,遍历对应的list,如果有请求的应输出时间小于当前时间,输出,标

渐入OO课的深处,探索多线程的秘密——OO第二次博客总结

一次又一次的挑战,一次又一次全新的知识,我来到了多线程的面前 第五次作业 1.度量分析 >第五次作业由于很大程度上调用的是前两次电梯的一些代码,所以存在的问题与前几次也十分相似.同时由于第一次使用多线程来解决问题,可能将某些功能过于集中的放在了个别类中.导致McCabe Cyclomatic Complexity以及Nested Block Depth出现标红的现象. 2.类图 >这次在类图上面问题体现的也很明显,在方法的分配上并没有做的很平均.这主要是由于为第一次多线程作业,所以将大部分的功

OO第二次博客

oo5_7 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,c

第二次博客作业

一.是否需要有代码规范 1.“这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西.” 其实好的代码风格自然而然就形成了,比如等号两边的空格和大括号的位置,形成习惯之后并不会浪费时间,反而是写的乱七八糟的话之后的复查会浪费时间. 2.“我是个艺术家,手艺人,我有自己的规范和原则.” 额...再艺术也是个程序员吧...如果说你写的代码只由你来维护的话就算写成梵高的画也没关系,但是代码是永存的,人是会被拍在沙滩上的,还是能让大家读懂的好. 3.“规范不能强求一律,应该允

文件服务相关博客作业

nfs和sameba博客作业 博客实践作业: (1) nfs server导出/data/目录: (2) nfs client挂载/data/至本地的/mydata目录:本地的mysqld或mariadb服务的数据目录设置为/mydata, 要求服务能正常启动,且可正常 存储数据 (3) 客户端(lamp)部署wordpress,并让其正常访问:要确保能正常发文章,上传图片: (4) 客户端2(lamp),挂载nfs server导出的文件系统至/var/www/html:验正其wordpres

第二版博客首页安装代码

css: #profile_block{text-align:center;position:absolute; top:60px; right:10px;} #blog-calendar{border-radius: 7px;background:#fff;} #p_b_follow{padding-top:10px;} #p_b_follow a{display:block;width:70px;height:35px; line-height:35px;mrgin-top:10px; te

https的博客作业

博客作业:分别使用httpd-2.2和httpd-2.4实现 1.建立httpd服务,要求: (1) 提供两个基于名称的虚拟主机www1, www2:有单独的错误日志和访问日志: (2) 通过www1的/server-status提供状态信息,且仅允许tom用户访问: (3) www2不允许192.168.0.0/24网络中任意主机访问: 2.为上面的第2个虚拟主机提供https服务: 前提准备: 172.16.1.1测试httpd-2.4,这是centos7系统 172.16.1.2测试htt

C语言博客作业--一二维数组

一.PTA实验作业 题目1:7-2 求整数序列中出现次数最多的数 1. 本题PTA提交列表 2. 设计思路 定义变量n,i,j,max等于0,a[]10用于存放输入的值,b[10]用于存放a[]中各个数有多少个; 输入n的值 i从0开始,每次加1,输入a[i]的值,直到i==n结束循环 i从0开始,判断i是否<n,,进入下一步,每次加一,直到条件不满足 j从0开始,判断j是否<n,,进入下一步,每次加一,直到条件不满足 如果a[i]==a[j],b[i]加一 i从0开始,判断i是否 输出a[j

博客作业1--抽象数据类型

一.作业题目 实验题目 试仿照三元组或复数的抽象数据类型写出有理数抽象数据类型的描述 (有理数是其分子.分母均为整数且分母不为零的分数). 有理数基本运算如下所示: 1.构造有理数R,元素x1,x2分别被赋以分子.分母值 2.销毁有理数R 3.用e(引用类型参数)返回有理数T的分子或分母,当入参i为1时返回分子, i为2是返回分母. 4.将有理数R的分子或分母更改为e,入参i为1时改变分子, i为2是改变分母 5.有理数R1,R2相加,结果存入有理数R3 6.有理数R1,R2相减,结果存入有理数