OO Summary Ⅱ
【第五次作业——多线程电梯】
类图

度量

协作图

设计分析:
多线程电梯是我第一次接触多线程,因此真的是无(瞎)从(g)下(2)手(写),感觉仿佛只是用一个调度器来调度3部电梯但又总觉得好像哪里不太对,加上清明节还出去浪了三天,回来以后只感觉到深深的凉意。经过了将近一天的设计(不设计好真的是一点一点都不敢写反正也要重构),总算是把大概流程理顺清楚了:输入类(InputHandler)识别输入并生成请求(Request)后加入到请求队列(reqList)中,由调度器(schedule)每次扫描请求队列然后统一调度,将请求分配给合适的电梯(Lift),然后电梯执行分配到的请求,并携带可以捎带的请求。
BUG分析:
遇到了多线程中第一个不知道该怎么办的bug,就是调度器扫描到队列中间时,如果有电梯突然变为空闲状态,就会导致中间的请求先进行分配。原本想到的策略是设置一个flag,当有电梯变为空闲时就变化一下flag,然后将调度器从头开始遍历请求队列,然后来一直都没有改好(菜得令人窒息),就只能在每次遍历后sleep个几十毫秒,因为毕竟遍历一次的时间很快很快,所以大多数情况下电梯变为空闲状态应该理论上大概都会落在调度器sleep的时候(心绪.jpg),从而大大降低了出现bug的概率(反正出现了也很难复现…)
【第六次作业——IFTTT】
类图

度量

协作图

设计分析:
本次IFTTT要求仅根据文件的快照来判断文件的改变,因此每输入一个监控对象(目录或文件)就将其包含的所有文件拍一个快照存储到一个ArrayList中去,然后下一次扫描时再拍一次,对比两次快照来得出信息。
BUG分析:
但不知是什么神奇的原因,在对比两次快照时总会出现神奇的bug,导致有小概率出现错误对应的情况。
【第七次作业——多线程出租车】
类图

度量

协作图

设计分析:
多线程出租车总的来说感觉和多线程电梯很相似,都是按照“生产者——消费者”的模型,输入类(InputHandler)识别输入并生成请求(Request)后加入到请求队列(reqList)中,由调度器(schedule)每次扫描请求队列然后统一调度,将达到3s的请求分配给合适的出租车(Taxi),然后出租车执行分配到的请求。
与电梯不同的是,电梯中处理“调度器扫描到中间需要分配而产生的问题”十分麻烦,且理论上仍存在bug,而本次在出租车中,当扫描到一个达到3s的请求时,则说明在请求队列中的、它前面的请求均达到了3s,因此break并从头开始遍历,这样就可以保证了先输入的请求先分配,只不过可能会有几毫秒的误差。
此外,由于指导书要求出租车按最短路径前往乘客出发地和去往乘客目的地,而计算最短路径的算法(bfs)还比较耗时间,因此若是在请求分配给出租车后再进行计算的话,累积起来会造成较大的误差。因此,本程序另开了一个计算(calculate)线程,当读入一个有效的请求后,就开始计算出发地和目的地的最短路径,从而节省时间,不过当输入足够多的请求的时候,还是会存在时间误差的问题……
BUG分析:
当一次输入多条请求的时候会crash然后落到UNKNOWN ERROR中,并不知道为什么……
【发现别人BUG的策略】
把自己debug的时候存下的数据给别人跑一遍就好,跑着跑着就又发现了一个自己的bug(微笑)。
【多线程设计总结】
设计一定要设计好了再开始码代码,一定要肯在设计上花时间,千万别急着写代码,设计的时候多和室友、大佬们聊聊,毕竟设计可以两三天,写代码基本上只要一个晚上。要是没设计好就盲目动笔,这周的夜晚怕是都要在重构中度过。
【心得体会】
每时每刻都要怀揣一颗感恩的心!
OO Summary Ⅱ的更多相关文章
- OO Summary Ⅳ
测试与正确性论证的效果差异 测试,或者说用断言进行黑箱测试,用大量的数据进行“覆盖性测试”,目的是当分支覆盖率达到100%也就是理论上来说所有可能的输入都已经测试过了,而输出结果均是正确的,那么我们理 ...
- OO Summary Ⅲ
规格化设计的发展历史 (这一部分并没有找到答案,于是参考了好黄和温莎莎的blogs) 1950年代,第一次分离,主程序和子程序的分离程序结构模型是树状模型,子程序可先于主程序编写.通过使用库函数来简化 ...
- OO unit1 summary
Unit 1 summary 一.前言 三周左右的学习,OO第一单元顺利结束了,个人认为有必要写个blog来反思总结一下自己第一单元的学习情况,以便更好地进行后面的学习. 之前从来没有写blog的习惯 ...
- OO unit4 summary
Unit4 一.第四单元作业的架构设计 第四单元个人认为主要是考察对于层次结构的理解,即如何理解并处理好UML图的树状结构组织,在理好层次之间以及层次内部的相互关系之后,就只剩下代码实现的问题了.但是 ...
- OO unit3 summary
Unit3 JML(Java Modeling Language) 是用于对 Java 程序进行规格化设计的一种表示语言,它对于方法内部具体是如何实现的并无要求,只是对方法的接口以及行为进行限制, ...
- OO unit2 summary
Unit2 一.第一次作业 1.UML 2.Sequence Diagram 3.同步块设置与锁处理 采用了生产者-消费者模式,用共享对象来连接不同的线程. 第一次作业中,我有三个线程:Receive ...
- ABAP OO的八大理由
原贴地址:http://scnblogs.techweb.com.cn/abaplv/archives/127.html 几年前SAP BASIS 4.6为ABAP扩展了OO功能,这是很多传统的ABA ...
- 【作业2.0】HansBug的5-7次OO作业分析与小结,以及一些个人体会
不知不觉又做了三次作业,容我在本文胡言乱语几句2333. 第五次作业 第五次作业是前面的电梯作业的多线程版本,难度也有了一些提升.(点击就送指导书) 类图 程序的类图结构如下: UML时序图 程序的逻 ...
- 第一节:从面向对象思想(oo)开发、接口、抽象类以及二者比较
一. 面向对象思想 1. 面向过程(OP)和面向对象(OO)的区别: (1):面向过程就是排着用最简单的代码一步一步写下去,没有封装,当业务复杂的时候,改动就很麻烦了 (2):面向对象将复杂的业务分离 ...
随机推荐
- d3.select(this)不能用箭头函数
d3中典型的数据绑定片段 const items = svg.selectAll('g') .data(gdfs,(d)=> d.name); const enter = items.enter ...
- MYSQL的基本函数 (加密函数)
AES_ENCRYPT(str,key) 返回用密钥key对字符串str利用高级加密标准算法加密后的结果,调用AES_ENCRYPT的结果是一个二进制字符串,以BLOB类型存储 AES_DECRYP ...
- Windows上搭建Flume运行环境
1.如果没有安装过Java环境,则需首先安装JDK. 可参考<Windows上搭建Kafka运行环境>中的搭建环境安装JDK部分 2.官方下载Flume(当前为apache-flume-1 ...
- 雷林鹏分享:C# 方法
C# 方法 一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块.每一个 C# 程序至少有一个带有 Main 方法的类. 要使用一个方法,您需要: 定义方法 调用方法 C# 中定义方法 当定 ...
- Confluence 6 权限概述
下面的权限可以指派给任何一个空间: 分类 权限 全部(All) 查看(View )给你能够查看空间内容的权限,包括有空间目录和其他的内容,例如主面板. 删除自己(Delete own) 给你权限删除你 ...
- vi常用快捷键
vi常用快捷键 1)移动光标 h :光标左移一个字符k :光标上移一个字符j :光标下移一个字符l :光标右移一个字符 0 :光标移至行首$ :光标移至行尾 H :光标移至屏幕首行M :光标移至屏幕中 ...
- Oracl 12c安装
Oracl安装部署 一.前置条件准备 修改hostname: hostname oracle 修改/etc/hosts:添加192.168.10.106 oracle 添加软件开发工具 搭建yum源 ...
- MySQL补充
1.mysql限制显示条目数:Limit, offset 图片网址:https://sqlbolt.com/lesson/filtering_sorting_query_results 实例: SEL ...
- 【洛谷p1031】均分纸牌
[博客园的第一条随笔,值得纪念一下] 均分纸牌[传送门] 洛谷上的算法标签是 这道题是一道贪心题,过了四遍才过(蒟蒻有点废) 第一遍的时候考虑的非常少,只想到了求出平均数→求差值→从左往右加差值: 这 ...
- python基础之函数参数,名称空间,以及函数嵌套
函数进阶内容梗概: 1. 函数参数--动态传参 2. 名称空间, 局部名称空间, 全局名称空间, 作⽤用域, 加载顺序. 3. 函数的嵌套 4. gloabal , nonlocal 关键字 1. 函 ...