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. windows下的python环境安装

    windows下python开发环境的搭建还是很方便的 python本体的下载可以通过官方渠道,也可以通过windows应用商店,这里推荐后者,因为前者还要设置环境变量,而且我设置了之后cmd下也没有 ...

  2. Fastdfs数据迁移方案

    1.     方案背景描述 环境迁移,需要迁移旧环境的fastdfs集群的数据到新环境,由于之前数据迁移仅仅是针对mysql和mongodb,对fastdfs数据的迁移了解甚少,本文档主要是针对fas ...

  3. SpringBoot(一):使用IDEA快速搭建一个SpringBoot项目(详细)

    环境: JDK1.8   Maven:3.5.4 1.打开IDEA,右上角选择File→New→Project 选择Spring Initializr(使用IDEA自带的插件创建需要电脑联网) 2.点 ...

  4. ios打包的IDP证书的创建方法

    在我们打包ios应用的时候,需要一个IDP证书. 那么我们如何生成这个IDP证书呢?网上介绍的方法都是需要使用mac电脑,然后用mac电脑的钥匙串访问的功能先生成csr文件,然后去苹果开发者生成,然而 ...

  5. 用go实现常见的数据结构

    目录 1 golang常见数据结构实现 1.1 链表 1.2 可变数组 1.3 栈和队列 1.3.1 原生切片实现栈和队列 1.3.1.1 切片原生栈实现 1.3.1.2 切片原生队列实现 1.3.2 ...

  6. POJ-1182(经典带权并查集)

    食物链 POJ-1182 一个很好的分析博客:https://blog.csdn.net/niushuai666/article/details/6981689 三种关系:两者同类,吃父节点,被父节点 ...

  7. redis使用ssh密钥远控靶机

      首先说明一下我们的实验目的,我们这个实验需要利用一种公有密码,将公有密钥写入要攻击的服务器的redis数据库,然后使用我们自己的私钥进行远控肉鸡的操作. 实验环境:centos7(靶机,版本无太大 ...

  8. Java安全初学之反射

    前言: 复现fastjson的时候深深意识到了需要好好学习一下Java和Java安全,激情的学习了一番java安全中重要的几部分:反序列化.反射.rmi.动态代理,从反射开始做个总结. 反射:java ...

  9. 死磕Spring之IoC篇 - @Bean 等注解的实现原理

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  10. Asa's Chess Problem

    一.题目 给定一张 \(n\times n\) 的矩阵,每个点上面有黑棋或者是白棋,给定 \(\frac{n\times n}{2}\) 对可以交换的位置,每对位置一定在同一行 \(/\) 同一列.\ ...