第五次作业 多线程电梯

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

  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. Mint wine

    卸载 http://blog.csdn.net/ouyangying123/article/details/459126051.终端中执行sudo apt-get remove wine1.3(win ...

  2. springboot 解决配置js/css/img缓存问题

    # 解决配置js/css/img缓存问题 spring.resources.chain.strategy.content.enabled=true spring.resources.chain.str ...

  3. github优秀前端项目分享(转)

    http://microjs.com/# 该网站的资源都托管到了github,microjs.com是一个可以让你选择微型的js类库的网站,该网站里的js库都是压缩后不大于5KB的,非常实用 http ...

  4. 第 3 章 镜像 - 013 - Dockerfile 构建镜像

    第一个 Dockerfile FROM ubuntu RUN apt-get update && apt-get install -y vim 运行 docker build 命令构建 ...

  5. PHP加密函数

    单向散列加密 单向散列加密是指通过对不同输入长度的信息进行散列计算,得到固定长度的输出.这个散列计算是单向的,即不能对固定长度的输出进行计算从而获取输入信息. 特征:雪崩效应.定长输出和不可逆 作用: ...

  6. 在python中使用正则表达式(三)

    这里主要说一下贪婪匹配和非贪婪匹配  贪婪匹配:匹配尽可能多的字符:  非贪婪匹配:匹配尽可能少的字符 python的正则匹配默认是贪婪匹配 例子: >>> re.match(r'^ ...

  7. missing seperator error when [make all]

    https://stackoverflow.com/questions/16931770/makefile4-missing-separator-stop makefile has a very st ...

  8. php算法,冒泡排序

    冒泡排序 /*** *从小到大排列 * 逻辑分析 假设数组 $arr=[a,b,c,d]; * 总数=4; * 比较对象 第几个元素 比较次数 * a 1 3 * b 2 2 * c 3 1 **/ ...

  9. 在项目中使用react

    1. 运行 ’cnpm i react react-dom -S' 安装包 react:专门用于创建组件和虚拟DOM,同时组件的生命周期都在这个包中 react-dom:专门进行DOM操作,主要应用场 ...

  10. 报错 hint: Updates were rejected because the remote contains work that you do 解决方法

    1. git pull origin master --allow-unrelated-histories 2.git pull origin master 3.git init 4.git remo ...