一、多线程的设计

  这三次作业的主要内容就是使用多线程并且解决多线程中出现的问题。而对于多线程我也有了自己的理解。首先明确的一点是单个CPU在同一时间只能处理一件事。那么,不管是多进程还是多线程,我们的CPU只是在其中不停地交换执行,只不过时间太短以至于用户感觉不到,这就是宏观上的并行,微观上的并行。我们的程序在启动的时候就会创建一个主线程,而我们可以在其中继续创建线程来完成我们的任务。

  这样交替执行会带来线程不安全的问题。这样的情况有很多,常见的状态就是在A线程执行一个对共享资源的操作中,被B进程打断(CPU去执行了B进程),但此时,A进程的操作并没有结束,应该改变的某些值还没有改变,那么此时执行的B进程在对共享资源操作的时候必然会出现错误。

  但是,多进程的使用是必然的,否则一些程序并没有任何实际价值。于是,有多种方法可以帮助我们实现代码的同步。Synchronized修饰符可以保证其内部的代码块是同步执行的,这个方法也是这三次作业中主要用到的方法。另外还有加锁机制和唤醒机制。

二、策略与设计

1)第五次作业:三部电梯的多线程设计

  调度器的任务就是预先判断和分装。在电梯中执行的时候是以每一层为粒度,到一层后扫描一遍当前电梯的队列,执行在这一层的请求。主要涉及的线程是主线程,调度器线程和三个电梯线程。共享资源的冲突点在与三个共享队列在不同线程之间被访问时候的线程安全问题。于是,队列采用了vector类。扫描器使用的是timer。

2)第六次作业:ifttt文件监控

  

每一个监控任务有一个成员变量是当前的snapshot(原snapshot)在每隔一定时间后,进行新的snapshot的生成,与原来的snapshot进行比较,如果满足监控作业的要求,则输出。主要的问题在与写文件时候,因此采用每隔5s扫描一次的timer策略来完成。另外,此次作业采用了TestThread线程控制的测试方法,通过程序直接控制文件系统。

3)第七次作业 100辆出租车的调度

有主线程,扫描线程和调度器线程。通过设置成员变量的累计方式,控制单个出租车的状态。

三、度量分析

  1)第五次作业:三部电梯的多线程设计

度量结果和前两次电梯作业的有一定的相似之处,因为调度器有继承,这一点可以从类图上看出来。新的调度器在重写的command_new方法上出现了超出标准的控制流和循环。其次,在电梯类中的remsame方法中,也是有很多控制流和循环。这个方法主要是用于判断并移除同质请求的,因为没有设置为方法,在程序中出现了三次,且判断过程也比较复杂,造成了电梯类内部冗余。

2)第六次作业:ifttt文件监控

主要的问题出现在比较快照的comp方法。在此方法中,需要比较四个监控作业的条件是否满足,需要比较的前提也都比较多,而且对detail.txt文件的输入才在这个方法中。其次就是在建立快照的run方法中,因为要实现将结果写入summary.txt文件中,需要控制流的参与。至于ele类的参数过多这一点是服务于detail.txt文件的输出。

3)第七次作业:100辆出租车的调度 

主要问题在pathlength方法中,此方法是用bfs来计算两点之间的最短距离,对四个方向的遍历需要较多的控制流,且打印路径的操作放在了此方法中,通过一个标志变量控制。

四、bug分析

1)在三部电梯的调度中,出现了一个较大的问题,我尝试了与前两次不同的实现方法,结果考虑不够周全,用错了一个变量,使计算时间的时候产生了累积效应,在电梯类的模拟运动方法中导致时间的计算有错误,于是影响到了程序对到达楼层时间的预判,是一个很大的失误。

2)在文件监控中,没有仔细注意重命名和文件路径移动时需要判断是否是新产生的文件,否则就会导致我删除一个文件却触发了重命名等监控器。

3)设计原则问题,在表示状态的时候用隐含信息的数字表示。

五、发现bug的策略

1)从小处着手,测试基本的功能。

2)造成公共资源的竞争情况,通过观察输出之间的逻辑关系,看是否有矛盾,不合理的情况。

3)大数据的压力测试

六、心得体会

  经历了这几次作业,对线程安全问题的解决停留在同步各个方法的基础层面上,这样操作使得程序运行慢,有些失去了多线程的优势。应该尝试着缩小同步代码块的范围,提高多线程的效率。

  对于有些设计原则的理解还比较浅薄,但是设计原则确实很考验程序员的功底。对于程序来说,仅仅实现功能是不够的,遵循设计原则可以很好地提高代码的复用性和可维护性。以后在设计时需要考虑这些原则,完成一个好的设计。

oo第八次作业--5,6,7次作业总结的更多相关文章

  1. oo第八次作业

    oo第八次作业 第五次作业分析: 1.度量图: 2.类图: 第五次作业由于是第一次接触多线程,所以导致自己的经验不足,因此最终也没有完成作业,到最后任然不能实现三部电梯的有效调度,所以导致了这次作业的 ...

  2. OO第四次博客作业(第四单元作业及期末总结)

    (注意:本文写作顺序与作业要求不完全一致,但涵盖了作业的所有要求) 一学期的BUAA特色OO课程结束了. PART 1  我想先写我这一学期的感想 从第一单元满怀期待地写完多项式求值到最后看着60分不 ...

  3. OO第四次作业-对前三次作业总结

    第一次作业由于直接没怎么学过java,全靠一星期速成,前几天看了java的语法,但是因为光看没有打代码,学习效果并不是特别好.由面向过程转向面向对象,不是特别清楚该怎么办,虽然写的是两个类,但实际上是 ...

  4. SQL Server代理(6/12):作业里的工作流——深入作业步骤

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 如我们在这里系列的前几篇文章所见,SQL ...

  5. 南京邮电大学java程序设计作业在线编程第二次作业

    王利国的"Java语言程序设计第2次作业(2018)"详细 作业结果详细 总分:100 选择题得分:60  1. 表达式9==8&&3<7的运算结果是( ) ...

  6. 《团队作业》五小福团队作业--UNO-- LandingDay--降落

    <团队作业>五小福团队作业--UNO-- LandingDay--降落 写在前面 几周的飞行之后,降落之日也如期而至了.在2018年12月19日我们顺利地完成了项目的总结汇报.但是,短暂的 ...

  7. 经典MapReduce作业和Yarn上MapReduce作业运行机制

    一.经典MapReduce的作业运行机制 如下图是经典MapReduce作业的工作原理: 1.1 经典MapReduce作业的实体 经典MapReduce作业运行过程包含的实体: 客户端,提交MapR ...

  8. 【BUAA 软工博客作业】个人博客作业

    项目 内容 课程:2020春季软件工程课程博客作业(罗杰,任健) 博客园班级链接 作业:热身作业,阅读并撰写博客 作业要求 课程目标 学习大规模软件开发的技巧与方法,锻炼开发能力 作业目标 阅读教材, ...

  9. 【Hadoop代码笔记】Hadoop作业提交之JobTracker接收作业提交

    一.概要描述 在上一篇博文中主要描述了JobTracker接收作业的几个服务(或功能)模块的初始化过程.本节将介绍这些服务(或功能)是如何接收到提交的job.本来作业的初始化也可以在本节内描述,但是涉 ...

随机推荐

  1. 史上最详细的codeblocks安装教程!!!

    codeblocks下载地址:https://www.cnblogs.com/yinbiao/p/8489748.html 下面是codeblocks具体的安装教程:

  2. Scrapy-从数据库取出IP并判断是否可用

    import pymysql import requests conn = pymysql.connect(host="localhost",user="root&quo ...

  3. Scala模式匹配常用

    今天在工作中遇到的几个小问题,总结一下: 1.因为业务需要调用PHP的接口,获取到的返回体需要做一段逻辑处理,然而某个字段接收到的参数是io.serializable类型,字段的类型不是预期的stri ...

  4. R语言文本挖掘+词云显示(jiebaR包+wordcloud2包)

    利用2018年政府工作报告的例子向大家展示一下R语言如何进行文本挖掘的~用到的包有jiebaR和wordcloud2. 1.安装并加载jiebaR install.packages("jie ...

  5. swt TableViewer

    http://blog.163.com/bluefield_wild/blog/static/8182709520085612235336/ package list; import java.uti ...

  6. WPF之ComboBox的VisualTreeHelper

    原文:WPF之ComboBox的VisualTreeHelper 用WPF的ComboBox控件的时候,需要用到TextChanged属性,但是这个属性属于TextBox控件,不用担心,ComboBo ...

  7. c++ 标准流文件

    一.标准流stdin,stdout,stderr   标准输入流stdin: 是程序可以读取其输入的位置.缺省情况下,进程从键盘读取 stdin . fscanf(stdin,"%d%d%f ...

  8. Linux部署python django程序-apache

    1.安装Apache 先卸载自带的httpd rpm -e httpd --nodeps 在网上下载四个文件 1.apr-1.4.6.tar.gz 2.apr-util-1.5.1.tar.gz 3. ...

  9. PDO访问方式操作数据库

    mysqli是专门访问MySQL数据库的,不能访问其它数据库.PDO可以访问多种的数据库,它把操作类合并在一起,做成一个数据访问抽象层,这个抽象层就是PDO,根据类操作对应的数据库.mysqli是一个 ...

  10. 1 nodejs

      重点 :