2019-oo-第二次总结
这一单元是关于模拟电梯运行,考验多线程的一个单元,难度由简入入深,从多线程单部电梯,到优化,再到多线程多部电梯,难度一次次的提高。
一.多线程单部电梯(傻瓜调度)
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-第二次总结的更多相关文章
- OO第二次博客作业——电梯调度
OO第二次博客作业——电梯调度 前言 最近三周,OO课程进入多线程学习阶段,主要通过三次电梯调度作业来学习.从单部电梯的傻瓜式调度到有性能要求的调度到多部电梯的调度,难度逐渐提升,对同学们的要求逐渐变 ...
- oo第二单元作业总结
oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...
- OO第二单元优化博客
OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...
- OO第二次博客作业—17373247
OO第二次博客作业 零.写在前面 OO第二单元宣告结束,在这个单元里自己算是真正对面向对象编程产生了比较深刻的理解,也认识到了一个合理的架构为编程带来的极大的便利. (挂三次评测分数 看出得分接近等差 ...
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
- OO第二次作业总结
OO~第二次作业总结 连续三周的电梯作业结束了,总的来说这三次作业做的还算平稳,既没有被刀,也没有刀中别人.那么接下来开始谈谈我对这三次作业的认识. 一.设计策略 我三次作业的设计思路基本上是相同的, ...
- OO第二单元小结
OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...
- OO第二单元多线程电梯总结
OO第二单元多线程电梯总结 第一次作业 设计思路 Input为输入线程,负责不断读取请求并将读到的请求放入调度器中. Dispatcher为调度器,是Input线程和Elevator线程的共享对象,采 ...
- OO第二次单元总结
OO第二次单元总结 前言 第二单元的三次作业:系列电梯与多线程. 第五次作业 (1)设计策略 电梯的第一次作业是单部傻瓜电梯,采用FAFS调度策略,电梯按队列顺序依次处理请求,单次只处理一个请求.本次 ...
- “全栈2019”Java第二章:安装JDK11(Windows)
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 文章原文链接 "全栈2019"Java第二章:安装JDK11(Windows) 下一 ...
随机推荐
- Codeforces Round #443 (Div. 1) C. Tournament
题解: 思路挺简单 但这个set的应用好厉害啊.. 我们把它看成图,如果a存在一门比b大,那么a就可以打败b,a——>b连边 然后求强联通分量之后最后顶层的强联通分量就是能赢的 但是因为是要动态 ...
- 一致推崇的Linux系统还有那么安全吗?
今天想谈谈关于系统安全:我们都知道,Linux早已成为趋势,在我们互联网中占有不可或缺的地位,在我们眼中,它是神圣的,不可替代的,无懈可击的:真的是这样的吗? 但是关于病毒对Linux所造成的一系列威 ...
- Java基础知识及学习规划【图】
结构图:
- DDoS攻击与防御(3)
3.攻击应用资源网络应用和服务在处理数据时,通常需要消耗一定的网络连接.计算和存储资源,这些资源是由应用程序向系统进行申请并自行管理和维护的.消耗应用资源的DDoS攻击就是通过向应用提交大量消耗资源的 ...
- Hierarchical clustering:利用层次聚类算法来把100张图片自动分成红绿蓝三种色调—Jaosn niu
#!/usr/bin/python # coding:utf-8 from PIL import Image, ImageDraw from HierarchicalClustering import ...
- 大数据技术 - MapReduce 应用的配置和单元测试
上一章的 MapReduce 应用中,我们使用了自定义配置,并用 GenericOptionsParser 处理命令行输入的配置,这种方式简单粗暴.但不是 MapReduce 应用常见的写法,本章第一 ...
- (DP) 关于最优三角剖分
https://www.cnblogs.com/Konjakmoyu/p/4905563.html 这个人写的好 最优三角剖分的核心思想: 确定决策顺序. 有时一个解可以用许多决策顺序得出, 这时候我 ...
- JavaScript 中 replace方法 替换所有字符串
需要替换一个字符串中所有的某个字符串 java中使用replaceAll()方法就可以了.但是JavaScript中没有replaceAll方法 但是可以通过以下方法实现: /** * 空格替换为下划 ...
- html页面转成jsp页面之后样式变化的问题解决方法
转载:https://blog.csdn.net/zeb_perfect/article/details/51172859
- jquery常用语句
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...