OO第二章总结

电梯作业终于结束了!!! 这三周作业用多线程模拟搭建电梯的运行,我从开始对多线程的一无所知到结束时的能够完成一些多线程任务的水平,进步还是蛮大的,尽管过程有点艰难。

一、复杂度与UML图分析

第一次作业

UML

Person类在本次作业没有用到,我只是预留了一个扩展类。MainClass类作为启动,PassengerQueue类是共享资源类,也就是生产者消费者模式的那个传送带。Input是生产者,Elevator是消费者。

复杂度分析

电梯类的WMC很高,也就是循环复杂度很高,代码有个地方进行了重复循环,有待改善。

第二次作业

UML

类的构造和上次基本没有区别。

复杂度分析

第二次作业问题和上次一模一样(代码复用的结果

第三次作业

UML

由于限定了电梯的种类,我便建立了三个电梯类,来是实现类别不同,这种方法有点笨重,可以进行抽象出三种类的公共之处作为一个类,这是有待完善的地方。

复杂度分析

三个类的代码是可重复复用的,写法过于臃肿了。

代码量

二、自己程序的BUG

程序的bug主要包括RTLE,CTLE以及单线程的逻辑问题。

1. RTLE

RTLE全称Real Time Exceed,在这三次作业中,评测机所给的Real Time都很大,一般调度是不会让程序RTLE的,产生的主要原因就是程序的线程无法停止。

无法停止有两个原因:一个是程序没有设置终止条件,无法停下来;另外一个就是可能程序里面出现了死循环,比如:电梯卡在某一层一直开关门,或者电梯在-1和1层游荡等就会导致电梯一直运行,而无法停止。

解决也很简单,在程序的结束增加输出的语句来判断Run方法是否结束,然后在每一个循环里面增加输出即可。

2. CTLE

这个就很常见了。。。。(在我的程序里面

CTLE全称CPU TIme Exceed。CTLE发生也就一个原因,就是发生了轮询,也就是一直进行判断是否满足条件,导致CPU一直在运行。

这样的bug说排除很简单,也可能很难。简单就是他产生原因很简单也很明显,说难就是它的出现可能是多线程随机的问题,很难复现。

我的排除方法就是仔细分析单线程的逻辑问题。毕竟轮询就是一个循环,一直在询问,那么程序里面一定会出现类似死循环的情况。在第三次作业里面通过这种方法,找到了bug出现的原因。另外一个方法就是努力去复现,因为有的死循环,可能是在某一个情况才出现,然后导致轮询。复现方法和RTLE一模一样。

3. WA

wa的情况就自己的程序一般逻辑的问题,很容易去复现,找到问题,解决即可。一般都是写代码时的马虎与不注意。

三、互测

互测找到别人的bug,我是靠自己写代码时的经验与经历,来构造特定的bug然后hack别人。

四、设计策略

1. 单部可携带ALS电梯

第一次作业的设计就很简单,只是一部电梯。我采用了生产者和消费者模式。

由于输入是实时的,我便设置了一个输入线程作为生产者,将请求添加到主请求(调度器)里面。单部电梯从主请求里面获取一个请求,然后运送,运送过程中如果遇到顺路的请求就顺路接到电梯。

两个线程的公共资源是主请求,在使用时需要对齐进行加锁,保证唯一使用。

2.多部可携带ALS电梯

第二次作业的设计是在第一次的基础上增加动态电梯线程创建和人数的限制。电梯线程的逻辑基本都一样。

这次电梯线程增加,一个输入线程作为生产者,多个电梯线程作为消费者,在每一个电梯在进行对主请求的写操作的时候,都需要加锁来保证写的唯一性。所以相比第一次作业这次电梯线程逻辑,对每一个写操作进行加锁。基本逻辑是没有任何改变的。

3. 多部可携带ALS电梯

第三次作业相比第二次作业增加了很多的限制条件,限定了电梯的可停靠楼层,限定了电梯的种类等,同时需要满足动态增加电梯的需求。

这次作业我实现了我前两次作业一直想要实现的一个Person类,用来扩展输入接口提供的Request类。因为前两次都没有必要去实现,也就没有实现,但这次电梯需要考虑进行换乘,所以就需要扩展Request类来增加能够更新需求的状态的操作。在实现Person类之后,我发现一切都变的和第二次作业如此的相似,我需要做的只是把需要换乘的人们在第一阶段之后进行更新状态即可。同时由于对电梯的可停靠楼层的限制,我不得不重新对线程的同步问题进行重新设计。

重构了线程终止的条件,同时改变线程等待的条件,并在每一个新增加需求之后唤醒每一个电梯线程,在没有需求的时候,便让他们进行休息。

可扩展性

第三次作业的可扩展性,可以支持动态删除电梯,可以动态启动电梯线程,只要是关于电梯的新的需求,需要改变的仅仅的顶层的一部分,对于电梯的基本运动逻辑是基本不需要任何改变的。

五、心得体会

对于多线程的设计模式,设计方法,设计思路等有了充分的了解,在多线程并发的能力上有了显著的提高。从开始的一无所知到后来能清晰的认识到电梯的运行过程,并精确快速找到bug,真的收获很多。但是也是能够清楚的认识到,其实多线程还有很多很多东西有待学习,电梯结束了,但是对多线程的学习刚刚起步。

三次作业的迭代明显比第一章的作业迭代要简单很多,并不需要很多的重构,很多代码都是能够重复使用的。而且在第一次作业的时候,我已经预料到在迭代的过程中,输入接口所提供的的Request类是需要被扩展的,才能满足需求,也就预留了很多小的设计在里面以方便后来扩展使用。

OO第二章总结的更多相关文章

  1. JAVA OO 第二章知识点

    一.JAVA的基础语法 1.关键字 ①关键字:关键字用于定义该门语言,且这些单词对编译器用特殊的含义,而且不能作为标识符. 2.标识符 标识符:在JAVA中我们备选的单词,包括:类名.方法名.字段.变 ...

  2. 第二章 OO大原则

    昨天忙了一天,晚上加班到了12点,虽然工作有时候比较累,但是整体来讲还是比较轻松的,国企加上我是今年才毕业的应届生,导致了现在这种情况.工资也真的不算高...但我觉得最开始还是要踏踏实实一点比较好.学 ...

  3. Java 第二章 变量

    第二章 变量 变量称为:是计算机语言中能储存计算机结果或能表示值抽象概念 .变量可以通过变量名访问 int money ; //变量 money=1000; //赋值 int money=1000: ...

  4. Python3-Cookbook总结 - 第二章:字符串和文本

    第二章:字符串和文本 几乎所有有用的程序都会涉及到某些文本处理,不管是解析数据还是产生输出. 这一章将重点关注文本的操作处理,比如提取字符串,搜索,替换以及解析等. 大部分的问题都能简单的调用字符串的 ...

  5. python 教程 第二章、 类型

    第二章. 类型 常量 5,1.23,9.25e-3,’This is a string’,”It’s a string!” 1) 数 整数:2 长整数: 浮点数:3.23,52.3E-4 复数:-5+ ...

  6. [head first 设计模式]第二章 观察者模式

    [head first 设计模式]第二章 观察者模式 假如我们有一个开发需求--建造一个气象观测站展示系统.需求方给我们提供了一个WeatherObject对象,能够自动获得最新的测量数据.而我们要建 ...

  7. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  8. 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...

  9. Jenkins入门系列之——02第二章 Jenkins安装与配置

    2014-12-08:已不再担任SCM和CI的职位,Jenkins的文章如无必要不会再维护. 写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之——03 ...

随机推荐

  1. nasm astrcat函数 x86

    xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...

  2. django学习-7.html模板中include标签使用场景

    1.前言 假设一个公司A有一个网站B,且网站B有5个不同的页面分别为C1,C2,C3,C4,C5. 那么,我们在打开这5个不同页面后去查看页面的整体内容,会发现每个页面的顶部内容.底部内容都一模一样. ...

  3. Github上优秀的.NET Core开源项目的集合

    内容包括:库.工具.框架.模板引擎.身份认证.数据库.ORM框架.图片处理.文本处理.机器学习.日志.代码分析.教程等. Github地址:https://github.com/jasonhua95/ ...

  4. 基于股票大数据分析的Python入门实战(视频教学版)的精彩插图汇总

    在我写的这本书,<基于股票大数据分析的Python入门实战(视频教学版)>里,用能吸引人的股票案例,带领大家入门Python的语法,数据分析和机器学习. 京东链接是这个:https://i ...

  5. 学习笔记-python基础

    一. 1.python按装 1.1 官网 https://www.python.org 1.2 点 downloads下的 windows下载64位python3.7.3版本 Download Win ...

  6. 导出----用Excel导出数据库表

    根据条件导出表格: 前端 <el-form-item label=""> <el-button type="warning" icon=&qu ...

  7. Django-用户权限,用户角色使用指南

    RBAC(Role-Based Access Control,基于角色的访问控制)就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用户 ...

  8. Django中文文档-模型Models(二):Meta选项、模型属性、模型方法

    元数据(Meta)选项 使用内部的class Meta 定义模型的元数据,例如: from django.db import models class Ox(models.Model): horn_l ...

  9. AWS Switching to an IAM role (AWS CLI)

    一,引言 今天额外分享一篇 AWS 的技术内容,需要在 EC2 切换到跨账号 IAM 角色(AWS CLI).假设我们使用两个 AWS 账户,A账号,B账号.我们希望允许 A 账号用于 "i ...

  10. Win命令行切换Python版本

    目录 安装2.x 和 3.x 的python 设置系统环境变量 pip的使用 参考 安装2.x 和 3.x 的python 我这里使用anaconda来安装两个版本的python包. conda cr ...