2019OO第二单元作业总结
OO第二单元的作业主题是模拟电梯。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第一次作业:FAFS傻瓜调度-单电梯模拟
1、多线程的协同和同步控制
本次作业的线程只有两个:调度器线程和电梯线程。调度器线程负责接收指令并维护一个请求队列,请求队列使用单例模式构造,由于电梯采用傻瓜调度,因此电梯线程每次从调度器的请求队列中取一个指令执行。在本次作业中,调度器线程和电梯线程唯一需要共享的对象是请求队列,因此为了保证线程安全,应在请求队列的getqueue方法前加上synchronize关键字。
2、程序结构
本次作业有4个类:Main类、Elevator类、Dispatcher类、InputHandler类。类图如下:

类复杂度分析如下:

方法复杂度分析如下:

3、自己程序的bug
由于本次作业比较简单,我们首次接触多线程可能会出现有线程提前结束或无法结束的情况,这可能是在写代码的时候遇到的最大的困难,逻辑上的问题其实并没有多少,可以把这次的作业抽象为一个简单的生产者-消费者问题。公测和互测均未发现bug。
4、如何发现别人的bug
本次作业比较简单,因此发现别人的bug也不容易,我没有发现别人有逻辑上的bug。至于线程方面的bug,我有听说有些程序可能输入数据后过一段时间再输入ctrl+D会出现无法结束的情况,但我本人并没有发现这样的bug。测试策略方面,与第一单元的策略略有不同的是,我可以选择在不同的时间投放测试数据,或是在同一时间投放几个数据,以测试线程的运行是否正确。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二次作业:ALS捎带调度-单电梯模拟
1、多线程的协同和同步控制
本次作业仍然是单电梯的调度,因此线程和第一次作业一样有两个:调度器线程和电梯线程。调度器线程的职责没变:负责接收指令并维护一个单例模式的请求队列。本次电梯的调度策略采用ALS捎带算法,电梯需要有一个主请求和若干个捎带请求,因此电梯需要自己维护一个请求队列。在本次作业中,调度器线程和电梯线程需要共享的对象还是调度器的请求队列,因此在调度器的getqueue方法前加上synchronize关键字。
2、程序结构
本次作业的类相比上一次并没有什么改变,还是4个类:Main类、Elevator类、Dispatcher类、InputHandler类。类图如下:

类复杂度分析如下:

方法复杂度分析如下:

3、程序bug
本次作业我完全采用了指导书中描述的ALS算法,因此正确性方面没有出问题,但同时性能分也基本没有。
4、如何发现别人的bug
与我同组的同学也基本采用同样的ALS算法,因此也很难找出逻辑上的漏洞。我没有发现bug。测试策略与本单元第一次作业基本相同,会加入一些可以捎带的请求组合来测试捎带算法的正确性与线程安全。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第三次作业:SS智能调度-多电梯模拟
1、多线程的协同和同步控制
本次作业是多电梯的调度,一共有三部电梯,因此是一个调度器线程和三个电梯线程并行。每部电梯能到达的楼层和运行速度均不同,乘客的请求可能无法由一部电梯直接送达,需要换乘,换乘的请求需要注意必须等到第一次电梯把乘客运送到换乘楼层之后第二部电梯才能接上乘客继续运送,注意到这点的情况下,我采用了电梯在运送完换乘的乘客后再将乘客放回请求队列并修改其属性信息,以保证正确的时间的先后顺序逻辑。本次电梯的调度策略并没有规定,我仍然采用ALS捎带算法。在本次作业中,调度器的请求队列可能被三部电梯同时访问而产生线程安全问题,因此我在每一个电梯上/下人的过程中都锁住了dispatcher这个对象以防止出问题。
2、程序结构
这次作业比上一次作业在捎带算法方面没有什么区别,只是多了需要换乘的乘客,因此我多了一个TransferPersonRequest类来处理需要换乘的请求,总共有5个类:Main类、Elevator类、Dispatcher类、InputHandler类、TransferPersonRequest类。类图如下:

类复杂度分析如下:

方法复杂度分析如下:

3、程序bug
这次的bug很多,强测正确率8/20,错误主要是因为在处理有关3层的调度的时候出现了很严重的逻辑错误,导致有关3楼的需要换乘的请求基本都无法正确执行,互测也被人抓着这个bug无限hack。这也是因为我的换乘请求处理不够全面,从上面的复杂度分析也可以看出,我的代码中有些方法复杂度太高,难以看出错误。
4、如何发现别人的bug
本次作业,有关3楼的换乘请求的处理确实是一个难点,因此我首先就用关于3楼的请求来测试其他同学,如1-FROM-3-TO-4,2-FROM-2-TO-3等,结果和我的情况差不多,互测的同学也基本在处理3层的请求时出现了问题,可能会出现乘客在3楼无限循环出入电梯的情况。其他的问题由于有了前两次作业的基础,并没有发现很多。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
心得体会
这三次作业都是有关多线程的。多线程程序中最重要的一点就是保证线程安全,我这三次作业基本没有出现线程安全的问题,这是很好的一点。关于线程安全需要注意的地方总结一下就是:某个共享资源(对象)在同时被多个线程访问并进行读写操作时可能会出现线程安全的问题,为了避免线程安全问题,可以采用在访问共享对象的时加锁、尽量不要将自己对象的修改权随便交给其他对象、在外部对象想要访问自己对象中的元素时,返回该元素的一个副本而不是该元素本身等方法。在设计原则方面,最好是每个对象做好自己的事,尽量减少与其他对象的交互,即所谓的“解耦”,这样既更加符合面向对象的思想,也可能可以减少锁的使用,提高多线程并行的效率。此外需要特别提出的一点就是,在这三次作业中,中测出现次数很多的问题是CPU_TIME_LIMIT_EXCEED,即CPU时间过长,这往往是由于程序中存在轮询的情况而导致的,比如在调度器请求队列中没有请求时,电梯可能会无限循环去检测请求队列中有没有请求,这样电梯线程就会一直占用着CPU资源,导致CPU时间超时。解决的办法也很简单,只需要利用sleep()或是wait()和notifyAll(),在电梯检测到调度器请求队列为空的时候让电梯线程等待一段时间或是等待直到被唤醒即可。
2019OO第二单元作业总结的更多相关文章
- 【BUAA-OO】第二单元作业总结
第二单元作业总结 ——电梯恐惧症患者的极限自救 一. 第一次作业程序分析 1. 设计策略简略分析 线程:主线程.输入线程和电梯线程,另有一个持有请求队列的调度器,一个对输入进行处理的Req ...
- OO第二单元作业总结【自我反思与审视】
第二单元作业的完成史,就是一部心酸的血泪史…… 多线程的出现为我(们)打开一片广阔的天地,我也在这方天地摸爬滚打,不断成长!如果说第一单元之前还对Java语法有所了解的话,那么这单元学习多线程则完全是 ...
- BUAA_OO第二单元作业总结——多线程
OO第二单元作业总结——多线程 单元任务 本单元主要的内容是通过模拟电梯的运行来熟悉多线程的实现,从简单的单部FAFS电梯开始,ALS电梯,到最后的多部ALS电梯. 一.设计策略分析总结 1.1 多线 ...
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
- BUAA OO 2019 第二单元作业总结
目录 总 架构 controller model view 优化算法 Look 算法 多种算法取优 预测未来 多线程 第五次作业 第六次作业 第七次作业 代码静态分析 UML 类图 类复杂度 类总代码 ...
- 电梯也能无为而治——oo第二单元作业总结
oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...
- OO第二单元作业小结
前言 转眼已是第九周,第二单元的电梯系列作业已经结束,终于体验了一番多线程电梯之旅. 第一次作业是单电梯的傻瓜调度,虽然是第一次写多线程,但在课程PPT的指引下,写起来还是非常容易:第二次作业是单电梯 ...
- 电梯模拟系统——BUAA OO第二单元作业总结
需求分析 官方需求 本次作业需要模拟一个多线程实时多电梯系统,从标准输入中输入请求信息,程序进行接收和处理,模拟电梯运行,将必要的运行信息通过输出接口进行输出. 本次作业电梯系统具有的功能为:上下行, ...
- 我永远爱着OOP——第二单元作业总结
第二单元的电梯真是愉♂快呢,多线程编程作为java编程OOP中的重要组成部分,通过这一个单元的学习,我也是有了很多全新的认识 那么下面就先例行一下公事 三次作业分析 第五次作业 设计分析 实现的电梯是 ...
随机推荐
- C# [GDI+] [API] Get Image bytes Length
MemoryBMP "{b96b3caa-0728-11d3-9d7b-0000f81ef32e}" 2 Bmp "{b96b3cab-0728-11d3-9d7b-00 ...
- 通读SCRUM实战指南教材,提出5个问题。
问题一:为什么要制定优先级的排定和调整? 创建一个排好优先级的项目组合并讲重点放在转移团队上,如果做得对,可以消除在项目数量超过团队能力 的情况下过于常见的多任务处理. 问题二:为什么我们要做文档? ...
- 小白的首个maven web项目Step1软件安装三(8.0.15mysql及workbench安装)
直接先开始下 MySQL 和 Workbench(mysql的可视化工具) ,注意下得是镜像版 .msi 后缀的 (mysql是纯控制面板的呈现方式,想要界面化操作可以装可视化工具,这里我装的是wor ...
- CDN原理介绍(转)
内容分发网络(Content delivery network或Content distribution network,缩写:CDN)是指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服 ...
- 提示Unused default export错误,如何解决
问题描述如下: 这个错误提示其实是webstorm的变量语法检查提示,修改一下它的配置就好了. 1.点击Webstorm右下角的小人,点击Configure inspections 2.在搜索框中输入 ...
- url_encode和base64
在用一个某开源插件做封装,想要传一些参数进去. 多数字段都是普通字符串参数,但是有一个字段传的是json,结果发现这个插件一看到大括号和双引号就识别错误了. 不想改这个插件的源码,考虑自己传进去的时候 ...
- python学习笔记3-函数
一.函数高级特性 1)列表生成式,列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. eg: >>> list(r ...
- php:数组与json数据相互转换
1.数组转json $json=json_encode(数组名) 数组转json字符串 2,json转数组 $arr=json_decode(json字符串,[true]) 不加true第一次转直接转 ...
- C\C++控制台程序隐藏方法总结
学习计算机,往往先从Windows环境下学习编程,学习编程,往往从C学起,学习C,往往又从控制台程序学习,何为控制台,就是那个黑框白字的界面.对于这样一个最初认为奇陋无比而现在认为无所不能的编程平台, ...
- Hadoop IO
检测损坏数据的常用方法是第一次进入系统时计算数据的校验和,然后和传输后新生成的校验和进行匹配.若匹配失败,则认为数据被损坏了.常用CRC-32(cyclic redundancy check,循环冗余 ...