OO第二次单元总结
OO第二次单元总结
前言
第二单元的三次作业:系列电梯与多线程。
第五次作业
(1)设计策略
电梯的第一次作业是单部傻瓜电梯,采用FAFS调度策略,电梯按队列顺序依次处理请求,单次只处理一个请求。本次作业采用了简单的生产者-消费者模式,而调度器则采用了单例模式。
(2)基于度量来分析自己的程序结构
类图:
复杂度分析:
依赖度分析:
本次作业很简单,共设计了四个类,除主线程外包含一个请求输入线程和一个电梯线程。Scheduler类为单例模式调度器,内部有一个请求队列。Input类负责请求的获取和存入,每当获取到一个有效请求时,调用调度器中add方法存入队列。Elevator类为电梯类,调用调度器中getArray方法获取请求并执行。类各有分工,便于拓展下一次作业。
(3)分析自己程序的bug
由于本次作业调度方法很简单,线程交互也不复杂,所以在公测和互测中并没有发现bug。但在写的过程中遇到的最大问题是无法关闭电梯线程,后得到解决。
(4)分析自己发现别人程序bug所采用的策略
由于设计简单,大部分人代码量很小,所以主要采用了阅读代码的方式寻找别人的bug。
第六次作业
(1)设计策略
电梯的第二次作业为单部可捎带电梯,采用ALS调度策略。和上一次作业相比,只是增加了负楼层以及改变了调度策略,因此设计模式完全继承于上一次作业,做出了部分改变。
(2)基于度量来分析自己的程序结构
类图:
复杂度分析:
依赖度分析:
本次作业也是四个类,除主线程外两个线程。Scheduler类调度器负责存储和分配请求。Input类负责请求的获取和存入。这次,在Elevator类中增加了一个请求队列,用于存储主请求及其可捎带请求,电梯每到一层与请求队列进行交互,从而判断乘客的进出。由于设计缺陷,Elevator.run方法过长,从由图中可以看出,其复杂度很高。
(3)分析自己程序的bug
由于最后时间紧迫,这次作业在写完进行很简单测试后便提交了,通过了中测。但在强测中,发现了致命bug而未进入互测。bug不涉及线程安全,而是调度算法的缺陷,当电梯到达某一楼层时,我采取先下后上,当全部下去后(队列为空),我需要从队列取出主请求,来判断是否可以上,这时便会报错error。当我改成先上后下,问题就不存在了。之后应该合理安排时间,多编写测试样例,避免低级错误。
第七次作业
(1)设计策略
电梯的第三次作业为多部多线程智能(SS)电梯。单部电梯的调度策略上,我仍采用了上一次作业的可捎带(ALS)调度。和上一次作业相比,由一部电梯变为三部电梯,而且这三部电梯的可停靠楼层、运行时间、最大载客量都不相同。最大的限制在于可停靠楼层不同,因此乘客可能需要在中间换乘才能到达目的地。最后,我采用了最简单直接的方法,将请求固定地拆分成两个请求,然后存入队列,等待执行。因此,本次作业设计模式基本继承于第二次作业,并做出了部分改变。
(2)基于度量来分析自己的程序结构
类图:
复杂度分析:
依赖度分析:
本次作业共五个类,除主线程外一个输入线程,三个电梯线程。这次新增加了一个Request类,用于将PersonRequest拆分后封装新的请求,有五个属性,增加了id和request,分别用于存放执行电梯号和换乘前请求。其它类的功能和上一次作业一样。Elevator.run方法继承于上一次的代码,由于时间不够,过长的问题没有解决。由于调度器的调度方法采用硬编码的形式,由一系列if-else组成,因此很明显,Scheduler.add方法复杂度很高,几乎无法拓展。
(3)分析自己程序的bug
性能较差,但在公测和互测中并没有发现bug。
(4)分析自己发现别人程序bug所采用的策略
在互测中仍主要依靠阅读代码来发现bug,但效果很不好。
总结
这一单元三次电梯作业让我们对多线程有了由浅入深的了解。但抛去暴力轮询的方法,我对wait和notifyall的使用还不够熟练,总会出现很多问题,在之后的学习中会多加练习,争取掌握。此外,在代码设计上仍有很大的不足,缺乏明确的设计而导致部分方法过长,先写后修难度很大,复杂度也很高,之后的作业中,要尽量在写之前设计分配好各方法,对代码风格和debug都有帮助。下一单元,继续努力!
OO第二次单元总结的更多相关文章
- OO第二次单元总结——电梯多线程调度问题
OO第二次单元总结--电梯多线程调度问题 在这个单元OO学习中,我们终于迎来了期待已久(不是)的电梯多线程调度作业,开启了OO打怪之路的新关卡.虽然说经过了这三次作业,我对于多线程的理解还不能算是熟练 ...
- oo第二单元作业总结
oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...
- OO第二单元优化博客
OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
- OO第二单元(电梯)单元总结
OO第一单元(求导)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉理解和掌握多线程的思想和方法.这个单元以电梯为主题,从一开始的最简单的单部傻瓜调度(FAFS)电梯到最后的多部 ...
- OO第二单元小结
OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...
- OO第二单元多线程电梯总结
OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...
- 电梯也能无为而治——oo第二单元作业总结
oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...
- 2020北航OO第二单元总结
2020北航OO第二单元总结 前言 本单元考察基于多线程的电梯调度问题,成功让我从一个多线程小白到了基本掌握了使用锁来控制线程安全的能力,收获颇多(充分体验了迷茫地de一个又一个死锁bug的痛苦). ...
随机推荐
- SpringCloud请求响应数据转换(二)
上篇文章记录了从后端接口返回数据经过切面和消息转换器处理后返回给前端的过程.接下来,记录从请求发出后到后端接口调用过的过程. web请求处理流程 源码分析 ApplicationFilterChain ...
- Python3基础 dict items 以元组的形式打印出字典的每一个项
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- ISSCC 2017论文导读 Session 14:ENVISION: A 0.26-to-10 TOPS/W Subword-Parallel DVAFS CNN Processor in 28nm
ENVISION: A 0.26-to-10 TOPS/W Subword-Parallel Dynamic-Voltage-Accuracy-Frequency-Scalable CNN Proce ...
- 用python + hadoop streaming 编写分布式程序(三) -- 自定义功能
又是期末又是实训TA的事耽搁了好久……先把写好的放上博客吧 相关随笔: Hadoop-1.0.4集群搭建笔记 用python + hadoop streaming 编写分布式程序(一) -- 原理介绍 ...
- 【Django】【四】测试
[Testing in Django] 通过参数可控制Django项目不同级别的测试. 1. 运行sign应用下所有的测试用例: \\guest\python manage.py test sign ...
- 一个对iBatis的总结写的不错(转载)
转载自:http://blog.csdn.net/panxueji/article/details/9852795 一. ibatis介绍 ibatis始于2002年,2010年更名为mybatis, ...
- django不返回QuerySets的API
以下的方法不会返回QuerySets,但是作用非常强大,尤其是粗体显示的方法,需要背下来. 方法名 解释 get() 获取单个对象 create() 创建对象,无需save() get_or_crea ...
- django用包来组织模型
在我们使用python manage.py startapp xxx命令创建新的应用时,Django会自动帮我们建立一个应用的基本文件组织结构,其中就包括一个models.py文件.通常,我们把当前应 ...
- Flutter实战:手把手教你写Flutter Plugin
前言 如果你对移动端有所关注,那么你一定会听说过Flutter.得益于Google,Flutter一经推出便得受到了广泛关注.很多开发者跃跃欲试,国内部分大厂,诸如美团.闲鱼等团队已经开始了Flutt ...
- Myeclise下tomcat启动报错,启动超时
错误截图如下: 大概说的是tomcat7在本地不能在45秒内启动,如果项目需要更多的时间,试着去更改server配置 解决方法: 找到项目工作空间目录下 workspace\.metadata\.pl ...