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第二次单元总结的更多相关文章

  1. OO第二次单元总结——电梯多线程调度问题

    OO第二次单元总结--电梯多线程调度问题 在这个单元OO学习中,我们终于迎来了期待已久(不是)的电梯多线程调度作业,开启了OO打怪之路的新关卡.虽然说经过了这三次作业,我对于多线程的理解还不能算是熟练 ...

  2. oo第二单元作业总结

    oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...

  3. OO第二单元优化博客

    OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...

  4. 【OO学习】OO第二单元作业总结

    OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...

  5. OO第二单元(电梯)单元总结

    OO第一单元(求导)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉理解和掌握多线程的思想和方法.这个单元以电梯为主题,从一开始的最简单的单部傻瓜调度(FAFS)电梯到最后的多部 ...

  6. OO第二单元小结

    OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...

  7. OO第二单元多线程电梯总结

    OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...

  8. 电梯也能无为而治——oo第二单元作业总结

    oo第二单元作业总结 一.设计策略与质量分析 第一次作业 设计策略 在第一次作业之前,我首先确定了生产者--消费者模式的大体架构,即由输入线程(可与主线程合并)充当生产者,电梯线程充当消费者,二者不直 ...

  9. 2020北航OO第二单元总结

    2020北航OO第二单元总结 前言 本单元考察基于多线程的电梯调度问题,成功让我从一个多线程小白到了基本掌握了使用锁来控制线程安全的能力,收获颇多(充分体验了迷茫地de一个又一个死锁bug的痛苦). ...

随机推荐

  1. VC++ 实现修改文件创建、访问、修改时间属性(转载)

    转载:http://sunnysab.blog.163.com/blog/static/18037500920134221295425/ struct _FILETIME { //结构体定义 DWOR ...

  2. Python3基础 set 删除list中的重复项

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  3. 多线程中的信号机制--signwait()函数【转】

    本文转载自:http://blog.csdn.net/yusiguyuan/article/details/14237277 在Linux的多线程中使用信号机制,与在进程中使用信号机制有着根本的区别, ...

  4. C# SQLite数据库操作

    WinCE项目开发   VS2008 自己写的SQLite数据库管理类代码如下: SQLiteManager.cs using System.Data; using System.Data.SQLit ...

  5. 如何解决Visual Studio2010 编译时提示系统找不到指定文件问题

    前一段时间,开始使用vs2010编写程序,可是在编译的时候总是报错,提示系统找不到指定文件,导致无法正常运行程序,花了好久时间终于找到原因解决,是因为常规的输出目录 要与链接的常规的输出文件要相对应. ...

  6. 2018提高组训练Day2

    A 算法 1 对于每组询问,暴力的算出每个二次函数的取值. 时间复杂度 \(O(nq)\).期望得分 \(20\) 分. 算法 2 当 \(x>0\) 时,要求 \(a_ix^2+b_ix\) ...

  7. python 正则表达式替换字符串中匹配的字符

    import re street = '21 Ramkrishna Road' print(re.sub('Road$', 'Rd.', street)) 将结尾的Road用Rd.替换

  8. 代码中特殊的注释技术 -- TODO、FIXME和XXX的用处

    借鉴地址:https://www.cnblogs.com/pengyingh/articles/2445826.html 在阅读一些代码时,经常会遇到诸如:TODO.FIXME和XXX的单词,它们是有 ...

  9. chrome的url列表里面也找不到chrome://plugins的原因

    plugins 页面被移除后,可以访问: chrome://settings/content 调整 Flash.PDF 的设置. 原本 plugins 页面就基本只剩下这两货了,移除掉确实没啥影响. ...

  10. [原][OSG]整理osg渲染一帧的流程

    参考:最长的一帧 先看下frame void ViewerBase::frame(double simulationTime) { advance(simulationTime);//记录仿真时间,帧 ...