这一单元是关于模拟电梯运行,考验多线程的一个单元,难度由简入入深,从多线程单部电梯,到优化,再到多线程多部电梯,难度一次次的提高。


一.多线程单部电梯(傻瓜调度)


1.设计策略

  这一次我只额外的开了一个线程,那就是电梯运行的线程,而通过单例模式创建了一个共享对象,在主线程中,输入数据,得到的数据push到共享对象里,而电梯的线程每运行到一层,判断共享对象中是否有可以上电梯的人。当然还有如何结束电梯,我是通过在电梯类设置了一个方法,当外面调用该类时就结束程序。


2.度量分析

图一.作业一类图

我是在Homework5中读入数据,并调用RequestQueue中push方法,push到共享队列,而此时的ElevatorResponse实时监测共享队列是否为空,若不为空,则调

用pull反法提取请求,电梯响应请求并运行,这次作业中我并未采取唤醒等待操作,而是直接暴力轮询。


3.自己bug分析

此次作业并未出现bug,感觉是因为这一次并未进行优化,所以大体框架也就比较简单,总共加上主线程也就两个线程。


4.互测方法

这一次不在像以前那样是多项式表达式的输入,这一次是依赖于时间的运行,在多线程中,如果采用暴力轮询,而不采用阻塞,就会导致当轮询一直运行下去,

过度占用CPU从而导致CPU运行时间过长而出现bug。其他的例如当访问某一共享对象并修改,不加锁也会出现问题。


二.多线程单部电梯(ALS方法)


1.设计策略

此次的情况与上一次作业比较,大抵是电梯运行情况不同,上一次是处理完一个请求再处理下一个,而这一次的情况则较为符合实际情况,在处理一个请求的同

时若在电梯运行的时候有其他人正好可以上电梯,则上电梯。但是这一次并为考虑电梯容量问题。所以我这一次作业就是在基于上一次作业基础上,只对电梯运行类进行修改。


2.度量分析

图二.作业二类图

我们可以看到图二与图一比较,只在电梯类有变化,之前的电梯类我只是简单的运行一个请求,再运行另一个,所以并没有写任何方法。而在这一次中我加了三

个方法,第一个执行电梯开门,第二个执行电梯关门,第三个执行电梯运行,而其中最重要的就是电梯运行这一个方法了,在这个方法中我调用了其他两个方法。也是执行ALS算法的关键。我在其中设置了一个判断,每到达一层就判断是否有请求满足情况上电梯,如果满足就从共享队列中pull。


3.自己bug分析

这次相对于上次,只要自己的电梯类没有出现逻辑问题,线程也不会出现问题。再加上这次的ALS比较简单,所以并没有出现bug。

4.互测方法

这一次不能设置超时bug,只能是多线程出现问题。而多线程,有可能线程并未结束,而程序结束了,也有可能暴力轮询出现问题。自己针对这两方面设置了样

例,但是自己却并没有找到bug。


三.多线程多部电梯(增加电梯限制)


1.策略分析

这一次对比上一次作业,增加了多部电梯,并加入了电梯限制。我的策略就是给每一个电梯分配一个请求队列,在RequestQueue中进行分发。而电梯的运行方式

还是和上一次的作业一样。只是取请求从其电梯对应的队列取。而其中有一个难点就是有的请求是需要两个电梯才能完成。所以我设置了一个未来队列,将需要两个电梯完成的请求分成两个请求,一个直接给分队列,另一个给未来队列,直到分队列中该请求完成,未来队列的请求才分配给分队列。其中判断的关键在与每个人的id是不重复的。而这一次的调度器也不再仅仅简单的是一个共享对象,而也是一个线程。


2.度量分析

图三.作业三类图

在和图二对比,我们可以看到,变换的在RequestQueue类里加了queueadd方法,其实,我在该类里一共new了4个共享队列,一个主队列,三个对应于电梯的分

队列,而queueadd方法就是将主队列的队列分配到三个分队列。也是这一次修改最多的地方。


3.自己bug分析

这一次电梯加了容量的限制,所以我在电梯类中的elevatorIn中加了是否满容量,却忽略了在elevatorRun中自己也有开门进人的操作,并没有判断。导致出现了

bug。


4.互测方法

这一次互测就有许多方面可以测试了,特别是电梯的限制是否满足(自己也出现了这种情况),还有就是当一个请求需要两部电梯完成时,是否能够成功完成。

当然还有就是线程问题。这一次较于上次的作业,多了一个调度器线程,如果不好好分析,对共享对象加锁。会很容易出现问题的。


四.总结


1.线程安全

首先遇到的暴力轮询出现的CPU过时的问题,该问题就促使我们寻找另一种好的方法来解决,就是唤醒与等待,当一个线程没有请求时就阻塞,直到有该线程才唤醒

。然后就是共同访问的问题了,由于后面有三个电梯,在对队列进行访问,并删除或增加,所以需要加锁。还有就是程序结束时需要结束所有线程,不然会导致超时。


2.设计原则

我认为设计最重要的就是每个部分做自己应该的事,互相交叉较少。互不干扰设计一个共享对象,电梯进行pull,而输入进行push,互不影响。独立出来调度器来分配

梯所做的就只有根据调度器所分配的请求进行运行。

2019-oo-第二次总结的更多相关文章

  1. OO第二次博客作业——电梯调度

    OO第二次博客作业——电梯调度 前言 最近三周,OO课程进入多线程学习阶段,主要通过三次电梯调度作业来学习.从单部电梯的傻瓜式调度到有性能要求的调度到多部电梯的调度,难度逐渐提升,对同学们的要求逐渐变 ...

  2. oo第二单元作业总结

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

  3. OO第二单元优化博客

    OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...

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

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

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

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

  6. OO第二次作业总结

    OO~第二次作业总结 连续三周的电梯作业结束了,总的来说这三次作业做的还算平稳,既没有被刀,也没有刀中别人.那么接下来开始谈谈我对这三次作业的认识. 一.设计策略 我三次作业的设计思路基本上是相同的, ...

  7. OO第二单元小结

    OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...

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

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

  9. OO第二次单元总结

    OO第二次单元总结 前言 第二单元的三次作业:系列电梯与多线程. 第五次作业 (1)设计策略 电梯的第一次作业是单部傻瓜电梯,采用FAFS调度策略,电梯按队列顺序依次处理请求,单次只处理一个请求.本次 ...

  10. “全栈2019”Java第二章:安装JDK11(Windows)

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 文章原文链接 "全栈2019"Java第二章:安装JDK11(Windows) 下一 ...

随机推荐

  1. Java是解释型还是编译型语言?

    有人说Java是编译型的.因为所有的Java代码都是要编译的,.java不经过编译就无法执行. 也有人说Java是解释型的.因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释型 ...

  2. [转]Windows下安装storm-0.9.1

    来源:https://www.cnblogs.com/liuruitao/p/4669657.html Windows下安装storm-0.9.1的详细步骤如下: 1.确定已经正确安装JDK1.6或J ...

  3. There is no getter for property named 'XXX' in 'class java.lang.String'解决方法

    <select id="ProjectHomePage" parameterType="string" resultType="java.uti ...

  4. sbadmin表单事件

    Form表单 自定义表单 <from action="" method="'><!---      这里可以用表单组件快速生成表单元素哦        ...

  5. 权限管理——shiro

    1.shiro整合spring a.导入依赖 <properties> <shiro.version>1.2.4</shiro.version> </prop ...

  6. XVII Open Cup named after E.V. Pankratiev. Grand Prix of America (NAIPC-2017)

    A. Pieces of Parentheses 将括号串排序,先处理会使左括号数增加的串,这里面先处理减少的值少的串:再处理会使左括号数减少的串,这里面先处理差值较大的串.确定顺序之后就可以DP了. ...

  7. js 执行顺序

    同步任务 异步任务 同步任务:立即执行 异步任务:进入到异步队列当中(Event Queue)eg:Ajax,SetTimeout,then,SetInterval Event loop 事件循环 T ...

  8. 树形数组 java

    2^k求法 int lowbit(int x) { return x&(-x); } lowbit()的返回值就是 2^k 次方的值. 基本树形数组的模板 import java.util.* ...

  9. 【循环数组的最大字串和】Maximal-sum Subsequence

    [循环数组的最大字串和]Maximal-sum Subsequence PROBLEM 题目描述 给一个 N×N 的矩阵 M,可以取连续的一段数(必须是横着或者竖着或者斜着,这个矩阵是循环的,具体如下 ...

  10. 脚本:截取euroc数据集bag文件的其中一段

    脚本:截取euroc数据集bag文件的其中一段 功能:截取euroc数据集bag中的一段供算法测试 python脚本 #!/usr/bin/env python # ----------------- ...