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第二次博客作业——电梯调度的更多相关文章

  1. OO第二次博客作业—17373247

    OO第二次博客作业 零.写在前面 OO第二单元宣告结束,在这个单元里自己算是真正对面向对象编程产生了比较深刻的理解,也认识到了一个合理的架构为编程带来的极大的便利. (挂三次评测分数 看出得分接近等差 ...

  2. OO第二次博客作业(第二单元总结)

    在我开始写这次博客作业的时候,窗外响起了希望之花,由此联想到乘坐自己写的电梯FROM-3-TO--1下楼洗澡,然后······ 开个玩笑,这么辣鸡的电梯肯定不会投入实际使用的,何况只是一次作业.还是从 ...

  3. oo第二次博客作业

    多线程协同与同步控制总结 第五次作业-多线程电梯 本次作业是我第一次接触多线程,建立了请求模拟器.调度器和电梯运行三种线程.请求模拟器负责在输入后识别有效请求:调度器在扫描有效请求后将新的请求加入请求 ...

  4. OO第二次博客作业--第二单元总结

    第一次作业 1. 设计策略 第一次作业,一共三个线程,主线程.输入线程和电梯线程,有一个共享对象--调度器(队列). 调度的策略大多集中到了电梯里,调度器反而只剩下一个队列. 2. 基于度量的分析 类 ...

  5. [BUAA OO]第二次博客作业

    第五次作业 这次作业是电梯系列作业的终极版,要求是使用多线程实现三部电梯的运行.这次作业的难点在于第一次运用多线程技术,对于线程中的行为并不了解,以及电梯功能的实现(如果之前作业采取的是扫描指令队列预 ...

  6. Java第二次博客作业

    Java第二次博客作业 时间过的很快啊,在不知不觉中这门课程的学习也就快要过去一半了,现在就来总结一下在这个第二个月的学习当中存在的问题以及得到的心得. 1.前言 第四次题目集和第五次题目集给我的感觉 ...

  7. 第二周博客作业 <西北师范大学| 周安伟>

    一,本周助教小结 逐步开始适应助教工作,对学生发布的博客进行点评,查看学生对软件工程前期的准备情况. 二,助教本人博客 https://home.cnblogs.com/u/zaw-315/ 三,学生 ...

  8. oo第二次博客-三次电梯调度的总结与反思

    本单元从电梯调度相关问题层层深入,带领我们学习并运用了了多线程相关的知识. 三次电梯调度依次为单电梯单容量.单电梯可携带.多电梯可携带. 一.我的设计 在第一次作业中,使用了最简单的FIFO调度方法. ...

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

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

随机推荐

  1. python五种调试或排错的方法

    1.print,直接打印,比较简单而且粗暴   在代码中直接输入print+需要输出的结果,根据打印的内容判断即可   2.assert断言,很方便,测试人员常常在写自动化用例的时候用的比较多   如 ...

  2. Python爬虫实践 -- 记录我的第二只爬虫

    1.爬虫基本原理 我们爬取中国电影最受欢迎的影片<红海行动>的相关信息.其实,爬虫获取网页信息和人工获取信息,原理基本是一致的. 人工操作步骤: 1. 获取电影信息的页面 2. 定位(找到 ...

  3. ssm客户管理系统的设计与实现

    ssm客户管理系统 注意:系统是在实现我的上一篇文章 https://www.cnblogs.com/peter-hao/p/ssm.html的基础上开发 1     需求 1.1   添加客户 客户 ...

  4. java游戏开发杂谈 - 画布和画笔

    在Eclipse里,编写如下两个类: package game2; import java.awt.Color; import java.awt.Graphics; import javax.swin ...

  5. 【Python3爬虫】常见反爬虫措施及解决办法(三)

    上一篇博客的末尾说到全网代理IP的端口号是经过加密混淆的,而这一篇博客就将告诉你如何破解!如果觉得有用的话,不妨点个推荐哦~ 一.全网代理IP的JS混淆 首先进入全网代理IP,打开开发者工具,点击查看 ...

  6. IdentityModel 中文文档(v1.0.0) 目录

    欢迎使用IdentityModel文档! 第一部分 协议客户端库 第1章 发现端点(Discovery Endpoint) 第2章 授权端点(Authorize Endpoint) 第3章 结束会话端 ...

  7. Redis调用的流程(新手使用)

    就用查省市为例,别人还没查就把所有都弄好,很浪费资源和时间,redis是为了存储常用的查询操作的[结果],以此来减少直接查询数据库的次数,以下内容仅供参考,请勿照抄.(如有说得不好之处,请指点.) 言 ...

  8. 瑞芯微发布最新旗舰应用处理器-RK3588

    在瑞芯微电子第四届“开发者之春”大会上,瑞芯微推出了新一代8nm旗舰处理器-RK3588 这个芯片将采用8nm 制程工艺.基于A76+A55 内核组合,具备4K UI性能.8K VPU,拥有NPU2. ...

  9. Git 分支模型

    翻译自:https://nvie.com/posts/a-successful-git-branching-model/ 在这篇文章中,主要介绍 Git 分支模型.不会谈论任何项目的细节,只讨论分支策 ...

  10. Windows To Go入坑记录

    什么是Windows To Go? https://en.wikipedia.org/wiki/Windows_To_Go 微软为了解决企业用户的需求而推出,可以在u盘或者移动硬盘启动window系统 ...