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.本单元的作业也让 ...
随机推荐
- 使用CompletableFuture实现异步编程
在开发中会碰到一种场景,如下 Object result1 = service1.func1();//执行80ms Object result2 =service2.func2();//执行50ms ...
- ASP.NET Core在CentOS上的最小化部署实践
引言 本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个Nginx-Powered AspNet Core Web准生产应用. 在开始之前,我们还是重温一下部署原理,正 ...
- 『简单dp测试题解』
这一次组织了一场\(dp\)的专项考试,出了好几道经典的简单\(dp\)套路题,特开一篇博客写一下题解. Tower(双向dp) Description 信大家都写过数字三角形问题,题目很简单求最大化 ...
- 在nuget上发布自己的程序集教程
前期准备 [1]注册nuget官网账号:注册地址:https://www.nuget.org/ [2]下载Nuget.exe文件:下载地址:https://www.nuget.org/downloa ...
- idea上maven使用心得(三)——用pom.xml添加jar包
下面是如何使用maven,maven在idea里面得结构应该是这样: scr底下是main,java是存放web的.java文件 resource目录一般是存放数据库连接数据的,或者存各种资源文件,音 ...
- 基于BootstarbTable实现加载更多的方式
在工作中,我们有时候会遇到一些需求实现每次在页面上显示的数据每次都是通过请求数据库端来实现,在不通过上一页,下一页的方式来实现我们要展示的数据,通过js请求每次加载10条或者任意数量的数据. 代码展示 ...
- Windows 安装 Scoop
Scoop介绍 scoop是Windows下的包管理工具 安装环境要求 1,操作环境:win10 2,确保你的 PowerShell 版本 >= 3. win7或许低于3,得升级.如何确认Pow ...
- vue 中 vue-router、transition、keep-alive 怎么结合使用?
<transition :name="name" mode="out-in" name="fade"> <keep-ali ...
- Linux 桌面玩家指南:12. 优秀的文本化编辑思想大碰撞(Markdown、LaTeX、MathJax)
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- 在 ASP.NET Core 中使用 MySql 踩坑记录
使用 Pomelo.EntityFrameworkCore.MySql 生成 MySQL 数据库 关于如何使用请查看项目文档即可 组件地址:https://github.com/PomeloFound ...