oo第八次作业--5,6,7次作业总结
一、多线程的设计
这三次作业的主要内容就是使用多线程并且解决多线程中出现的问题。而对于多线程我也有了自己的理解。首先明确的一点是单个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次作业总结的更多相关文章
- oo第八次作业
oo第八次作业 第五次作业分析: 1.度量图: 2.类图: 第五次作业由于是第一次接触多线程,所以导致自己的经验不足,因此最终也没有完成作业,到最后任然不能实现三部电梯的有效调度,所以导致了这次作业的 ...
- OO第四次博客作业(第四单元作业及期末总结)
(注意:本文写作顺序与作业要求不完全一致,但涵盖了作业的所有要求) 一学期的BUAA特色OO课程结束了. PART 1 我想先写我这一学期的感想 从第一单元满怀期待地写完多项式求值到最后看着60分不 ...
- OO第四次作业-对前三次作业总结
第一次作业由于直接没怎么学过java,全靠一星期速成,前几天看了java的语法,但是因为光看没有打代码,学习效果并不是特别好.由面向过程转向面向对象,不是特别清楚该怎么办,虽然写的是两个类,但实际上是 ...
- SQL Server代理(6/12):作业里的工作流——深入作业步骤
SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 如我们在这里系列的前几篇文章所见,SQL ...
- 南京邮电大学java程序设计作业在线编程第二次作业
王利国的"Java语言程序设计第2次作业(2018)"详细 作业结果详细 总分:100 选择题得分:60 1. 表达式9==8&&3<7的运算结果是( ) ...
- 《团队作业》五小福团队作业--UNO-- LandingDay--降落
<团队作业>五小福团队作业--UNO-- LandingDay--降落 写在前面 几周的飞行之后,降落之日也如期而至了.在2018年12月19日我们顺利地完成了项目的总结汇报.但是,短暂的 ...
- 经典MapReduce作业和Yarn上MapReduce作业运行机制
一.经典MapReduce的作业运行机制 如下图是经典MapReduce作业的工作原理: 1.1 经典MapReduce作业的实体 经典MapReduce作业运行过程包含的实体: 客户端,提交MapR ...
- 【BUAA 软工博客作业】个人博客作业
项目 内容 课程:2020春季软件工程课程博客作业(罗杰,任健) 博客园班级链接 作业:热身作业,阅读并撰写博客 作业要求 课程目标 学习大规模软件开发的技巧与方法,锻炼开发能力 作业目标 阅读教材, ...
- 【Hadoop代码笔记】Hadoop作业提交之JobTracker接收作业提交
一.概要描述 在上一篇博文中主要描述了JobTracker接收作业的几个服务(或功能)模块的初始化过程.本节将介绍这些服务(或功能)是如何接收到提交的job.本来作业的初始化也可以在本节内描述,但是涉 ...
随机推荐
- iPhone将NSString转换编码集为gb2312或者gbk的方法
很多时候软件读取的中文网页编码集是gb2312,所以显示出来的是乱码.这时需要将NSString文字编码转换.你可以试试以下代码 NSURL *url = [NSURL URLWithString:u ...
- Mac端 Open GL初探
一.环境配置 1.创建macOS工程 2.添加OpenGL.framework和GLUT.framework两个系统库 3.拖入资源文件 如果libGLTools.a问价先拖入到工程其他位置,后再移到 ...
- bootstrap-treeview使用
1.数据 var tree = [{ text: "车型A", nodes: [{ text: "车系1", }, { text: "车系2" ...
- Weblogic申请和配置SSL证书
一. 概述 SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协 ...
- 20155239吕宇轩 Linux下IPC机制
20155239吕宇轩 Linux下IPC机制 - 共享内存 原理:把所有需要使用的共享数据都存放在共享内存 区域中,任何想要访问这些共享数据的进程都必须在自己的进程地址空间中新增加一块内存区域,用来 ...
- Autoanalyze 的注意事项
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页 根据官方文档的说明 http://www.p ...
- Linux下开发python django程序(django数据库多对多关系)
1.多对多关系数据访问 models.py设置 from django.db import models # Create your models here. sex_choices=( ('f',' ...
- Velocity学习3
Velocity快速入门教程 Apache的速度是一个基于Java的的模板引擎(模板引擎),它允许任何人仅仅简单的使用模板语言(模板语言)来引用由java的代码定义的对象. 官网介绍如下: Veloc ...
- SpringMVC初写(三)Controller的生命周期
Spring框架默认创建的对象的方式是单例,所以业务控制器Controller也是一个单例对象 由此可证明,无论是同一次请求还是同一次会话和不同请求它的对象都是相同的 然而由于对象是单例的,随之而来的 ...
- let和var定义变量的区别
使用 let 语句声明一个变量,该变量的范围限于声明它的块中. 可以在声明变量时为变量赋值,也可以稍后在脚本中给变量赋值. 使用 let 声明的变量,在声明前无法使用,否则将会导致错误. 如果未在 ...