第五次作业 多线程电梯

多线程同步和控制的设计策略

  1. 明确类和对象,以及是否区分对象实例。具体类可以从类图中看出;
  2. 明确线程的类型和数量。输入作为一个线程,调度作为一个线程,三个电梯独立工作,互不影响,分别是一个线程;
  3. 明确线程之间共享的数据,控制同步,以及保证线程安全。输入线程将输入存放在请求队列中,调度类访问请求队列中的请求,所以对请求队列的操作需要做到互斥,即要加锁;电梯线程接受到请求后处于运动状态,其各个属性参数在不断变化,而调度器调度时需要访问电梯的属性状态,所以为了保证得到的是准确数据,改变和访问电梯状态的操作需要上锁,做到互斥;

类图

  

设计方案

  这次电梯可以看做是生产者消费者模型,其实发现,如果能够找到一种模型来适应工程,其实核心的设计模式就已经出来了。其中,当请求队列不空时,调度器就从请求队列中取请求进行调度,为空时,调度器就需要等待,知道请求队列中有请求是,再将调度器唤醒。而每个电梯都有自己的执行请求队列,当这个请求队列不空时,唤醒该电梯线程,为空时,等待,用到了两次生产者消费者模型。其他关于调度的算法和前两次电梯基本差不多,就是多了电梯之间的选择。

度量

OO度量

  可以看出,调度器的圈复杂度标红了,复查代码发现这个方法的代码重复率比较高,三种情况,基本是一样的代码,应该是当时懒了,设计原则的意识还很弱,导致圈复杂度较高;对于重复的代码,便可以抽象出一个方法,用起来也十分简明,复杂度也会有较大的改善。

Bug分析

此次多线程电梯调试花了很久时间,由于时间很紧,就只实现了基本的功能,对于指导书要求的严格的时间输出,没能实现,挂了几个点。互测的时候拿到一个只能识别格式的代码,基本功能都不能实现,所以测试也较为容易,没去深究更小概率的bug。

第六次作业IFTTT

多线程同步控制的设计策略

  1. 明确类和对象,判别是否区分对象实例。从类图中可以看出该工程的各个类;
  2. 明确线程的类型和数量。一个文件一个线程,一个目录一个线程,三个动作三个线程。这次的线程类型是确定的,但是文件线程的数量却是动态的,不确定的,需要根据输入的监控文件对象个数来确定,但是好在程序是在已经确定了输入后才真正开始运行,这么说其实线程的数量也是确定的。
  3. 明确线程之间共享的数据,控制同步,以及保证线程安全。这次实现的是对文件的监控,以及触发动作,由此引入了快照这一概念。文件属性是作为此次工程的核心,也是共享数据,所有的操作都是围着它转的,首先是有一个文件安全类,专门提供对文件的一系列操作方法接口,必须保证是互斥的,文件监控线程需要访问文件的属性,必须保证此刻获取到的文件属性是正确的以及最新的,比较过程为和快照对比。

类图

  

设计方案

整体的设计思路是根据输入的IFTTT构造监控线程,初始化快照,当监控到变化需要触发操作时,触发相应线程的更新快照,快照是作为监控线程对象的一个属性存在的,监控线程保持一定周期的频率扫描文件。

度量

  

  

度量分析 

  对目录监控的函数出现圈复杂度过高的现象,其中主要是用了两重循环和if条件嵌套,对于目录的监控,需要检测目录下的每一个文件,而目录下还可能有目录,所以在和快照比较的时候嵌套就复杂了些,尝试中发现要是将这个对比过程在抽象出一个函数,圈复杂度就会好很多,还是需要注意单一性原则,实现功能模块化。

第七次作业

多线程同步和控制的设计策略

  1. 明确类和对象,以及是否区分对象实例。类图中可见;
  2. 明确线程的类型和数量。输入一个线程, 调度器一个线程,100辆出租车100个线程,计算路径的线程。
  3. 明确线程之间共享的数据,控制同步,以及保证线程安全。输入和调度器共享用户请求队列,所以请求队列为共享数据,需要保证互斥原则,调度器获取出租车状态信息,出租车自动改变状态信息,所以出租车的状态信息为共享数据,需要保证访问互斥。

类图

  

设计方案

这次的设计和之前的多线程电梯有相似之处,实现实时调度,面对一个请求,选择最优的车辆去执行请求,但是整体的复杂度感觉比多线程电梯高一些。输入线程将输入放入请求队列中,当请求队列不为空时,调度器遍历请求队列,为每一个请求寻找发送讯息的出租车队列,其中每一个请求控制在3秒的窗口期,当抢单窗口关闭时,就确定了该请求的最后出租车队列,然后再根据挑选出租车的原则选出最终执行请求的出租车,在这期间,计算线程一直在计算每一个请求的最短路径,并将最短路径保存在相应请求的Point容器属性中,出租车在启程是必须确保该请求的最短路径已经得出,其中对于最短路径的计算需要保证互斥,因为函数中有一个距离数组是共享的。这样执行效率是很低的,因为计算最短路径比较费时,调度也不够灵活,不能够将每一个请求分离开。想过为每一个请求建立一个线程,但又担心自己维护不好,出了奇奇怪怪的错误,就没这样实现,后面会去尝试这样做。

度量

  

  

  

度量分析

  随机化出租车运行路线函数,寻找最短路径函数,以及调度器中的寻找合适出租车函数,这三个函数复杂度确实挺高的,感觉稍微写个两层循环,以及一些判断条件语句圈复杂度就会爆掉,但是要是将一个功能函数再进行拆分,有会感觉这样太过零散,调用的深度又会增加。在代码的质量上还需要进行不断的深究。

Bug分析

这次作业我没有交,因为没有实现功能,自己在设计和实现的连接方面还十分欠缺,总写出bug连连的代码,准确的说是写出的代码和自己心里想的完全是两个东西,也许是coding的太少,由于直接无效,所以并未进入互测阶段,也没有测同学的程序,继续努力吧。

心得体会

  三次多线程,可以说是做的一次比一次差了,是心态变了,还是真的作业难度增加了,也许都有吧。但并不是没有收获,最起码自己还是去设计了,学习了多线程的相关知识,去按照设计原则编写了自己的代码,虽然实现的效果很差。反应比较慢,逻辑能力欠缺,思维也不够缜密,在实现逻辑功能的时候容易出现bug(感觉设计的时候还是不够细致),并且完成代码后的调试过程比较慢,但是时间又是有限的,所以结果并不如人意。我觉得自己在实现这些工程的时候确实是有困难的,不想只是为了不无效而交上一份质量非常差的代码,这也是我第七次不交作业的原因,反应慢就需要比别人花费更多的时间去学习,补给站也定是有它的意义所在,但能够正常避免不去补给站,就尽量不去,无论在哪,目标只是想老老实实完成这门课的要求——2000行高质量的OO程序,希望自己可以做到。

oo作业总结报告2的更多相关文章

  1. oo作业总结报告

    oo第一次博客 以前从未真正的写过Java代码,接触Java也只是寒假的时候简单的看了看语法,不懂该如何面向对象,但没事,心里不惧,想着什么都是可以学的(直到真正开始写工程的时候,才发现自己还是太天真 ...

  2. OO作业总结报告3

    规格化设计的发展史 下面部分来源:https://www.cnblogs.com/eggert/p/9098446.html: 随着计算机硬件的飞速发展,以及应用复杂度越来越高,软件规模越来越大,原有 ...

  3. oo作业总结(二)

    概述 和前三次作业相比,这几次作业最大的不同是难度的飞跃.遗憾的是在这难度的变化面前,我自己却没有做好充分的准备,错误的低估了作业难度导致给自己带来了很多不必要麻烦和损失.接下来我将对它们进行说明(度 ...

  4. oo作业总结(四)

    测试与正确性论证 测试是通过构造一系列测试数据,通过对比程序的实际运行结果和预期输出结果来判断程序是否有bug的一种手段.同时,在测试的时候是默认看不到程序的具体实现的,即进行黑盒测试,例如每次OO作 ...

  5. oo作业总结(一)

    概述 经历了三次oo作业的洗礼,让我对java语言的强大以及面向对象编程有了初步的理解(当然,我是小白).本文接下来就将对自己这三次作业的代码进行分析以及分享自己的心路历程. 基础知识点考核 针对前三 ...

  6. 北航oo作业第一单元小结

    前言 在经过了三次艰辛的oo作业后,oo课程的第一单元告一段落,这一单元,我作为一个oo小白,开始了解oo的编程思想,也有了自己的一点心得体会.把笔粗成字,不当之处,还请各位大佬多多指教. 一.分析程 ...

  7. 北航oo作业第四单元小结

    1.总结本单元两次作业的架构设计 在我动手开始总结我的设计之前,我看了其他同学已经提交在班级群里的博客,不禁汗颜,我是真的偷懒.其他同学大多使用了新建一个类,用以储存每一个UMLelemet元素的具体 ...

  8. 【作业2.0】HansBug的5-7次OO作业分析与小结,以及一些个人体会

    不知不觉又做了三次作业,容我在本文胡言乱语几句2333. 第五次作业 第五次作业是前面的电梯作业的多线程版本,难度也有了一些提升.(点击就送指导书) 类图 程序的类图结构如下: UML时序图 程序的逻 ...

  9. 【作业】HansBug的前三次OO作业分析与小结

    OO课程目前已经进行了三次的作业,容我在本文中做一点微小的工作. 第一次作业 第一次作业由于难度不大,所以笔者程序实际上写的也比较随意一些.(点击就送指导书~) 类图 程序的大致结构如下: 代码分析 ...

随机推荐

  1. x1c2017 8G版 win linux的取舍纠结记录

    x1c 2017 的 i5 7200U 8G ram 的丐版.换了1T SSD.其实一般使用没啥问题. 1 外出携带的轻便性太满意(mac13寸相比之下都太重了): 2 coding时候的安静性,比原 ...

  2. 移动采编app

    大家好: 移动采编app用到了一些非该app定义的控件,比如照相机以及涉及到权限的弹窗等.这部分控件的元素id在不同品牌甚至同一品牌不同型号的手机上可能是不同的,因此安卓自动化中需要对这种情况做相应的 ...

  3. 有效利用1 on 1

    2019-01-08 16:32:13 感觉1 on 1是浪费时间? 感觉1 on 1时没啥好说? 感觉老板总是不想1 on 1? 怎样才能 升职加薪? 一切都从有效的1 on 1开始!! 什么是1 ...

  4. 关于nodejs访问mysql的思考

    nodejs要访问mysql数据库,首先必须要安装包mysql,命令:npm install mysql.安装成功后的访问数据库代码如下: var mysql = require('mysql'); ...

  5. HeadFIrst Ruby 第六章总结 block return values

    前言 这一章通过抽取一个文件中的确定的单词的项目进行讲解,主要包括了: File 的打开.阅读与关闭 find_all & refuse方法的相关内容 map 方法的相关内容这章的核心是:关于 ...

  6. PHP工厂模式计算面积与周长

    <?phpinterface InterfaceShape{ function getArea(); function getCircumference();} /** * 矩形 */class ...

  7. Music in Car CodeForces - 746F (贪心,模拟)

    大意: n首歌, 第$i$首歌时间$t_i$, 播放完获得贡献$a_i$, 最多播放k分钟, 可以任选一首歌开始按顺序播放, 最多选w首歌半曲播放(花费时间上取整), 求贡献最大值. 挺简单的一个题, ...

  8. 更改 Windows 软件默认安装位置教程

    在打开的“运行”窗口中,输入命令regedit,然后点击确定按钮 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 百度 ...

  9. CSS3--难以想象的滤镜效果

    CSS 语法 filter: none | blur() | brightness() | contrast() | drop-shadow() | grayscale() | hue-rotate( ...

  10. nginx-exporter安装使用

    一.没有vts的启动方式   #nginx_exporter -telemetry.address=:9113 -nginx.scrape_uri="http://127.0.0.1:100 ...