OO第二次博客作业——电梯调度
OO第二次博客作业——电梯调度
前言
最近三周,OO课程进入多线程学习阶段,主要通过三次电梯调度作业来学习。从单部电梯的傻瓜式调度到有性能要求的调度到多部电梯的调度,难度逐渐提升,对同学们的要求逐渐变高,我们对线程的理解也逐渐加深。下面笔者将对三次作业分别进行总结。
一、单部多线程傻瓜调度(FAFS)电梯
说明:本次作业需要模拟一个多线程实时电梯系统,从标准输入中输入请求信息,程序进行接收和处理,模拟电梯运行,将必要的运行信息通过输出接口进行输出。本次作业对性能要求非常宽松,不需要进行优化处理。

构思:由于不考虑性能,在Main中每收到一个输入,新开启一个Request线程,Request线程调用电梯类Elevator的work方法。其中work方法是synchronized的方法,所以一个请求未处理完前其他请求被阻塞。

程序复杂度:


由于算法简单,复杂度较低。
程序依赖:

在依赖上表现良好。
评价:在线程安全性上很完美,并且完成了所有功能,没有bug。缺点在于性能不够优秀XD。这次作业算是多线程的一次小练手,熟悉了多线程编程方法。
二、单部多线程可捎带调度(ALS)电梯
说明:本次对电梯性能有一定要求,需要我们自行设计算法或使用A Little Smart算法。
构思:考虑到对性能的要求,使用的是类Look算法。具体而言,电梯扫描同一方向的请求至无同向,然后反向。根据这一思路,设计了5个类。Main创建Controller和Elevator两个线程。Controller负责接收输入,并向RequestList中存入请求。Elevator扫描RequestList并取出请求。

程序复杂度:

平均复杂度尚可,在电梯类中有少数方法复杂度稍高。主要是遍历请求列表和while循环电梯上下运行导致的,不可避免。
依赖:

代码行数:

评价:在强测中出现了一个bug:同时间输入大量请求,而调度器未能全部同时接受导致超时。分析:电梯上下楼、开关门时白白占用RequestList的锁,应该让调度器继续运作。调整了锁的分配,如关门时让电梯wait一定时间,此时调度器可以占用锁。
总结:由于对锁的分配没有思考到位,没有最大化优化临界资源使用率,导致在极端情况下性能出现问题。

三、多部多线程智能(SS)调度电梯
说明:本次作业有多部电梯,对性能要求放松了,将重点放在线程安全和同步的设计上,在于最大限度降低耦合,每个对象只应该管自己该管的事。
构思:延续上次作业的思路,对每个电梯分配一个请求队列,调度器可以观察3个请求队列,并选择性写入。电梯在乘客换乘时调用调度器进行添加请求。这样一来,就最大限度地降低了耦合。只有请求队列是共享资源,容易处理线程的同步。
类图:


复杂度:


在遍历请求列表时复杂度变大,总体较好。
依赖:

Controller与Elevator共享请求队列。
行数:

评价:
强测出现bug,发生了死锁。排查后发现问题在于在添加请求这一方法上偶然出现互相持有资源导致。调整synchronized的范围,使死锁的必要条件消失(请求资源前放弃资源)解决了bug。
总结:
在设计程序时没有预防死锁这一bug的出现,说明对线程同步的考虑仍然不够周到。然而失败是最好的老师,在这一次作业完成后,认识到构思程序时,应更加谨慎、全面地考虑线程安全问题。
Bug攻防
采用测评机发现bug,在最后一次阅读代码发现了bug。
心得体会
(1)保证线程安全。
做好资源的分配,尤其是预防死锁的出现。
(2)集中化数据管理。
将一组单独写成一个类便于管理,例如电梯的状态。
(3)在底层类实现方法,提供接口,顶层类直接调用,让自己的代码更有层次感、
OO第二次博客作业——电梯调度的更多相关文章
- OO第二次博客作业—17373247
OO第二次博客作业 零.写在前面 OO第二单元宣告结束,在这个单元里自己算是真正对面向对象编程产生了比较深刻的理解,也认识到了一个合理的架构为编程带来的极大的便利. (挂三次评测分数 看出得分接近等差 ...
- OO第二次博客作业(第二单元总结)
在我开始写这次博客作业的时候,窗外响起了希望之花,由此联想到乘坐自己写的电梯FROM-3-TO--1下楼洗澡,然后······ 开个玩笑,这么辣鸡的电梯肯定不会投入实际使用的,何况只是一次作业.还是从 ...
- oo第二次博客作业
多线程协同与同步控制总结 第五次作业-多线程电梯 本次作业是我第一次接触多线程,建立了请求模拟器.调度器和电梯运行三种线程.请求模拟器负责在输入后识别有效请求:调度器在扫描有效请求后将新的请求加入请求 ...
- OO第二次博客作业--第二单元总结
第一次作业 1. 设计策略 第一次作业,一共三个线程,主线程.输入线程和电梯线程,有一个共享对象--调度器(队列). 调度的策略大多集中到了电梯里,调度器反而只剩下一个队列. 2. 基于度量的分析 类 ...
- [BUAA OO]第二次博客作业
第五次作业 这次作业是电梯系列作业的终极版,要求是使用多线程实现三部电梯的运行.这次作业的难点在于第一次运用多线程技术,对于线程中的行为并不了解,以及电梯功能的实现(如果之前作业采取的是扫描指令队列预 ...
- Java第二次博客作业
Java第二次博客作业 时间过的很快啊,在不知不觉中这门课程的学习也就快要过去一半了,现在就来总结一下在这个第二个月的学习当中存在的问题以及得到的心得. 1.前言 第四次题目集和第五次题目集给我的感觉 ...
- 第二周博客作业 <西北师范大学| 周安伟>
一,本周助教小结 逐步开始适应助教工作,对学生发布的博客进行点评,查看学生对软件工程前期的准备情况. 二,助教本人博客 https://home.cnblogs.com/u/zaw-315/ 三,学生 ...
- oo第二次博客-三次电梯调度的总结与反思
本单元从电梯调度相关问题层层深入,带领我们学习并运用了了多线程相关的知识. 三次电梯调度依次为单电梯单容量.单电梯可携带.多电梯可携带. 一.我的设计 在第一次作业中,使用了最简单的FIFO调度方法. ...
- OO第二单元总结(多线程的电梯调度)
经过第一单元作业的训练,在做第二单元的作业的时候,要更加的有条理.但是第二次作业多线程的运行,带来了更多的运行的不确定性.呈现出来就是程序会出现由于线程安全问题带来的不可复现的bug.本单元的作业也让 ...
随机推荐
- HTTP协议中GET和POST区别
GET一般用于获取和查询资源信息:POST一般用于更新信息,表示可能修改服务器上资源的请求 GET请求一般是幂等的 GET请求数据会附加在url之后,POST请求数据放到request-body中 G ...
- spring,springMVC中常用注解
一,使用注解: 在spring的配置文件applicationContext.xml中,加入注解扫描.配置项就配置了对指定的包进行扫描,以实现依赖注入. <?xml version=" ...
- Telerik控件集-2019.R1.SP1.All
Telerik 专注于微软.Net平台的表示层与内容管理控件,提供高度稳定性和丰富性能的组件产品DevCraft,并可应用在非常严格的环境中.Telerik拥有 Microsoft, HP, Alco ...
- 自学Python,新手上路,好资源免费分享
Python 可以用来做什么? 在我看来,基本上可以不负责任地认为,Python 可以做任何事情.无论是从入门级选手到专业级选手都在做的爬虫,还是Web 程序开发.桌面程序开发还是科学计算.图像处理, ...
- asp.net core系列 49 Identity 授权(上)
一.概述 授权是指用户能够访问资源的权限,如页面数据的查看.编辑.新增.删除.导出.下载等权限.ASP.NET Core 授权提供了多种且灵活的方式,包括:Razor pages授权约定.简单授权.R ...
- 理解 KMP 算法
KMP(The Knuth-Morris-Pratt Algorithm)算法用于字符串匹配,从字符串中找出给定的子字符串.但它并不是很好理解和掌握.而理解它概念中的部分匹配表,是理解 KMP 算法的 ...
- LDA && NCA: 降维与度量学习
已迁移到我新博客,阅读体验更佳LDA && NCA: 降维与度量学习 代码实现放在我的github上:click me 一.Linear Discriminant Analysis(L ...
- Dotnet全平台下APM-Trace探索
背景 随着支撑的内部业务系统越来越多,向着服务化架构进化,在整个迭代过程中,会逐渐暴露出以下问题. 传统依赖于应用服务器日志等手段的排除故障原因的复杂度越来越高,传统的监控服务已经无法满足需求. 终端 ...
- HTML 练习拖动面板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 一起学Android之Menu
概述 菜单(Menu)在Android开发中,是一种常见的用户界面组件,通过使用菜单Api可以给用户提供常见的一致的体验.本文主要讲解三种菜单的相关内容. 菜单的分类 选项菜单(OptionsMenu ...