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


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


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. python 2.7 数据结构: 基础面试总结

    python中基础的数据类型包括: 1 Number(数字) 2 String(字符串) 3 List(列表) 4 Tuple(元组) 5 set(集合) 6 Pictionary(字典) 按照可变数 ...

  2. EHDU-1039 asier Done Than Said?

    Password security is a tricky thing. Users prefer simple passwords that are easy to remember (like b ...

  3. 理解ActivityManagerService

    --摘自<Android进阶解密> *AMS家族* 1.Android 7.0的AMS家族 2.AMP和AMS进行通信 3.(Android 7.0)AMP是AMN的内部类,它们都实现了I ...

  4. js事件循环机制 (Event Loop)

    一.JavaScript是单线程单并发语言 什么是单线程 主程序只有一个线程,即同一时间片断内其只能执行单个任务. 为什么选择单线程? JavaScript的主要用途是与用户互动,以及操作DOM.这决 ...

  5. Chapter_9 DP : uva1347 tour (bitonic tour)

    https://cn.vjudge.net/problem/UVA-1347 这道题居然可以O(n^2)解决, 让我太吃惊了!!! 鄙人见识浅薄, 这其实是一个经典问题: bitonic tour. ...

  6. (89)Wangdao.com第二十二天_JavaScript DocumentFragment 节点

    DocumentFragment 节点 代表一个文档的片段,本身就是一个完整的 DOM 树形结构. 它没有父节点,.parentNode 返回 null 可以插入任意数量的子节点. 不属于当前文档,操 ...

  7. (98)Wangdao.com_第三十天_拖拉事件

    拖拉事件 拖拉 drag ,是指用户在某个对象上按下鼠标键不放,拖动它到另一个位置,然后释放鼠标键,将该对象放在那里. 一旦某个元素节点的 draggable 属性设为true,就无法再用鼠标选中该节 ...

  8. Safari 浏览器模拟iPhone和其他浏览器

    1.打开safari浏览器中的偏好设置 2.在偏好设置中,选择高级,勾选在菜单栏中显示开发菜单 3.打开开发,进入响应式设计模式 4.可以选择iphone 或ipad.浏览器等不同模式,进行模拟 5. ...

  9. 滑动viewpage

    Adapter: package com.example.fashionyuan.Adatader; import android.support.v4.app.Fragment;import and ...

  10. Python全栈-magedu-2018-笔记2

    第二章 - Python 基础语法 基本语法 注释 -- # 标注的文本 数字 整数,不区分long和int 进制0xa.0o10.0b10 bool,2个值True.False 浮点数 1.2.3. ...