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. 【Maven篇】---解决Maven线上部署java.lang.ClassNotFoundException和no main manifest attribute解决方法

    一.前述 maven 线上部署的话会出现一些问题比如java.lang.ClassNotFoundException或者no main manifest attribute的话,是因为maven 配置 ...

  2. Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-2.xml, reason:

    http://blog.csdn.net/gyming/article/details/8168166/ 最近接受的这个项目需要Android SDK Tools revision 22.6.2 or ...

  3. LaTeX 公式编辑

    推荐一篇关于LaTeX的文档:<一份不太简短的LATEX 2ε介绍> 1. 常用数学公式符号: 求期望 $\mathbb{E}$ \mathbb{E} 正负无穷 $+\infty$,$-\ ...

  4. ab性能测试工具的使用

    一.什么是ab ab,即Apache Benchmark,是一种用于测试Apache超文本传输协议(HTTP)服务器的工具. ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访 ...

  5. xamarin android如何将Java.Lang.Object类型转成C#类型

    问题起源 其实这个标题也可以换一个更准确一点,因为我遇到的问题是: xamarin android中的Class继承了Java.Lang.Object ,将json序列化成c#类型时发现无法赋值,序列 ...

  6. 非常贴心的轮子 FreeSql

    FreeSql 项目从2018年11月28日开发至今,版本已发布至 v0.3.12,版本规则:年数-月-日-当日版本号.目前主要包括 FreeSql.FreeSql.Repository 两个项目的维 ...

  7. MongoDB【快速入门】

    1.MongDB 简介 MongoDB(来自于英文单词"Humongous",中文含义为"庞大")是可以应用于各种规模的企业.各个行业以及各类应用程序的开源数据 ...

  8. .NET(WinCE、WM)转Android开发——Xamarin和Smobiler对比

    对比 WinCE Android 行业场景 扫描分拣.车载.工控 扫描分拣.车载定位 开发语言 C++.C# Java/.NET(Smobiler) 开发环境 Visual Studio Androi ...

  9. C# 23种设计模式

    目录 0).简单工厂模式 1).工厂方法模式 2).抽象工厂模式 3).单例模式 4).构建者模式 5).原型模式 6).适配器模式 7).修饰者模式 8).代理模式 9).外观模式 10).桥接模式 ...

  10. Android ADB命令详解

    adb的全称为Android Debug Bridge.是android司机经常用到的工具 . 你能在本篇文章中学到什么? adb基本指令 Shell AM&PM adb模拟用户事件 logc ...