第五次作业分析

1.设计策略

  调度器采用单例模式,内部设请求队列,对请求队列的一切操作(查、增、删)都在调度器内完成,且都要求串行,从而确保线程安全。接收器和电梯是两个线程:接收器接受请求调用调度器来存入请求队列,接受器关闭时通知调度器;电梯调用调度器来获得请求,电梯从调度获得空请求且查询到接受器关闭时停止运行。

2.度量分析

(1)复杂度矩阵

方法复杂度:

类复杂度:

由于这一次作业是简单的单电梯傻瓜调度,所以方法和类复杂度都比较低。

(2)类图

(3)协作图

3.bug分析

没有bug。

第六次作业分析

1.设计策略

与上次作业相比,本次作业仅仅增加了捎带,故整体策略不变,仅改变电梯调度的算法为扫描算法且增加捎带功能。

 由于在调度器,我们只关注乘客的出发楼层和目标方向,而在电梯内,只关注乘客的目标楼层。所以可以将调度器中的请求队列分割为上行请求队列和下行请求队列以及乘客目标楼层图,在电梯内新增楼层到达图:

上行请求队列:每一层有哪些乘客要上行;

下行请求队列:每一层有哪些乘客要下行;

乘客目标楼层图:每一位乘客要在哪一层出电梯;

楼层到达图:每一层有哪些乘客要出电梯。

 实现捎带:

 电梯到达每一层时向调度器发送捎带请求,调度器将对应方向请求队列中该层的乘客的目标楼层图返回给电梯,电梯捎带这些乘客,将他们加入对应楼层到达图对应楼层的乘客列表。

 实现扫描算法:

 电梯属性中新增方向和目标楼层。

电梯中没有乘客(当前楼层为目标楼层),选择主请求(新的目标楼层)时:

①选择方向与电梯当前方向一致,且出发楼层在电梯当前楼层的当前方向上的最近请求,若存在这种请求:

若该请求在当前楼层,则将该乘客目标楼层设为电梯目标楼层;

否则将该请求出发楼层作为电梯目标楼层。

②若不存在①中那种请求,则选择方向与电梯当前方向相反,但出发楼层在电梯当前楼层的当前方向上的最远请求,若存在这种请求,将电梯方向取反:

若该请求在当前楼层,则将该乘客目标楼层设为电梯目标楼层;

否则将该请求出发楼层作为电梯目标楼层。

③若不存在②中那种请求,则选择方向与电梯当前方向相反,且出发楼层在电梯当前楼层的当前方向反方向上的最近请求,若存在这种请求,将电梯方向取反:

若该请求在当前楼层,则将该乘客目标楼层设为电梯目标楼层;

否则将该请求出发楼层作为电梯目标楼层。

④若不存在③中那种请求,则选择方向与电梯当前方向相同,但出发楼层在电梯当前楼层的当前方向反方向上的最远请求,若存在这种请求:

将该请求出发楼层作为电梯目标楼层。

⑤若不存在④中那种请求,说明当前没有请求,若接收器关闭则停止运行电梯,否则等待请求到来。

每一次捎带后:

若电梯上行,存在乘客的目标楼层中最高的在电梯目标楼层更高层,则将该楼层设为电梯目标楼层;

若电梯下行,存在乘客的目标楼层中最低的在电梯目标楼层更低层,则将该楼层设为电梯目标楼层。

2.度量分析

(1)复杂度矩阵

方法复杂度:

类复杂度:

扫描调度算法的实现稍微有些复杂,乘客进入电梯和更新目标楼层的方法要遍历对应的捎带图,导致电梯循环复杂度稍高。

(2)类图

 

(3)协作图

4.bug分析

没有bug。

第七次作业分析

1.设计策略

本次作业为多电梯调度,每个电梯有对应的可达楼层。

我采用的是静态分配请求的策略。新增一个分配器,每个请求刚刚收到就规划好其需要搭乘的第一部电梯及对应的出电梯的楼层,将其分配给对应电梯的调度器,每个电梯由自己的独立的调度器根据自己内部的请求进行独立调度,每个请求出电梯后若未到达目标楼层再新生成请求提交到分配器。

这种策略简单但在一些情况下效率可能不高。

2.度量分析

(1)复杂度矩阵

方法复杂度:

类复杂度:

除了捎带和扫描算法导致的复杂度问题,这次的分配器为每一个可能的x层到y层的请求选择第一次搭乘的电梯和出电梯楼层的方法也较为复杂,另外在主方法中手动创建每个电梯的可达楼层列表使用不少循环导致主方法循环复杂度较高。

(2)类图

(3)协作图

4.bug分析

由于开始写的时间太晚,导致压着时间点完成,最后忙中出错,没有初始化时间戳,这一次作业无效了。

SOLID原则

1.SRP(单一责任原则)

个人感觉三次作业每个类的责任都比较单一,最后一次可能应该写一个类来创建电梯,不应该直接放在主方法中。

2.OCP(开放封闭原则)

 第五次作业的调度器接收请求的方法在第六次进行了重写,因为改变了请求队列的存储方式。

3.LSP(里氏替换原则)

没有父子类,不讨论。

4.ISP(接口分离原则)

 三次作业的接口设置的都较为合理,没有这方面的问题。

5.DIP(依赖倒置原则)

三次作业的类间依赖都是自然合理的,没有这方面的问题。

总结与心得

多线程编程的debug是一个头疼的大问题,所以一定要从一开始就小心谨慎,尽量避免程序中出现bug。

另外,最重要的:

 永远不要拖延!

OO第二单元总结——多线程电梯的更多相关文章

  1. 2019年北航OO第二单元(多线程电梯任务)总结

    一.三次作业总结 1. 说在前面 对于这次的这三次电梯作业,我采用了和几乎所有人都不同的架构:将每个人当作一个线程.这样做有一定的好处:它使得整个问题的建模更加自然,并且在后期人员调度变得复杂时,可以 ...

  2. OO第二单元总结(多线程的电梯调度)

    经过第一单元作业的训练,在做第二单元的作业的时候,要更加的有条理.但是第二次作业多线程的运行,带来了更多的运行的不确定性.呈现出来就是程序会出现由于线程安全问题带来的不可复现的bug.本单元的作业也让 ...

  3. OO第二单元作业——魔鬼电梯

    简介 本单元作业分为三次 第一次作业:第一次作业要实现单部简单电梯,停靠所有楼层,无载客容量,性能分考量电梯运行时间. 第二次作业: 第二次作业实现多部电梯,电梯数量由初始化设定,每部电梯都停靠所有楼 ...

  4. oo第二单元作业总结

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

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

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

  6. OO第二单元——多线程(电梯)

    OO第二单元--多线程(电梯) 综述 第二单元的三次联系作业都写电梯,要求逐步提高,对于多线程的掌握也进一步加深.本次作业全部都给出了输入输出文件,也就避免了正则表达式判断输入输出是否合法的问题. 第 ...

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

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

  8. OO第二单元电梯线程系列总结作业

    电梯系列第一次作业 功能描述: 傻瓜电梯无需考虑超载捎带 线程模式: Producer-Consumer Pattern 思路: 第一次作业是一个傻瓜电梯,分别有一个生产者生成电梯指令(也就是Inpu ...

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

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

随机推荐

  1. 网络层和arp协议

    1:arp协议功能:获取mac地址 ----------------------在同一个局域网:发送端mac  接收端mac(FF:FF:FF:FF:FF:FF:FF) 源IP  目标IP  数据 - ...

  2. 网络协议 12 - HTTP 协议:常用而不简单

    系列文章传送门: 网络协议 1 - 概述 网络协议 2 - IP 是怎么来,又是怎么没的? 网络协议 3 - 从物理层到 MAC 层 网络协议 4 - 交换机与 VLAN:办公室太复杂,我要回学校 网 ...

  3. 是时候给大家介绍 Spring Boot/Cloud 背后豪华的研发团队了。

    看了 Pivotal 公司的发展历史,这尼玛就是一场商业大片呀. 我们刚开始学习 Spring Boot 的时候肯定都会看到这么一句话: Spring Boot 是由 Pivotal 团队提供的全新框 ...

  4. 玩转Spring Cloud之配置中心(config server &config client)

     本文内容导航: 一.搭建配置服务中心(config server) 1.1.git方式 1.2.svn方式 1.3.本地文件方式 1.4.解决配置中包含中文内容返回乱码问题 二.搭建配置消费客户端( ...

  5. 文件输入输出流工具: IOUtils使用总结

    序言 以前写文件的复制很麻烦,需要各种输入流,然后读取line,输出到输出流...其实apache.commons.io里面提供了输入流输出流的常用工具方法,非常方便.下面就结合源码,看看IOUTil ...

  6. PostgreSQL相关整理

    PostgreSQL权限管理之创建可更新表的普通用户 https://my.oschina.net/aven92/blog/528943 PostgreSQL学习手册(角色和权限) http://ww ...

  7. [C#] C# 与 Nessus 交互,动态构建扫描任务计划

    C# 与 Nessus 交互,动态构建扫描任务计划 目录 什么是 Nessus? 创建会话类 NessusSession 登录测试 创建操作类 NessusManager 操作测试 什么是 Nessu ...

  8. SpringCloud-sleuth-zipkin链路追踪

    什么是Zipkin? 它是一个分布式链路跟踪系统它可以帮助收集时间数据,每个应用程序向Zipkin报告定时数据,Zipkin UI呈现了一个依赖图表来展示多少跟踪请求经过了每个应用程序:如果想解决延迟 ...

  9. css3 动画 总结

    原来的时候写过一个小程序,里面有一个播放背景音乐的按钮(也是一个圆形的图片),它是一直在旋转的,当我们点击这个按钮的可以暂停或者播放背景音乐.当初的这个动画,是同事自己写的,我看到的时候以为是他在上面 ...

  10. Web前端2019面试总结

    基础知识点   1.水平垂直居中 子绝父相,子盒子设置绝对定位,设置top:50%;left:50%,margin-top:-50%;margin-left:-50%; 子绝父相,子盒子设置绝对定位, ...