2019北航oo课程第二单元作业总结..#_#..
学习了之前在写代码是从来没有见过的多线程之后,便迎来了此次电梯作业。说实话,这次作业做得十分的辛苦,虽然在前三次作业中领悟到了java面向对象的精髓,但是再加上了多线程之后,又开始理不清思路,对自己的代码胡诌八扯了。但是欣慰的是,在最后两次作业中,我仿佛领悟到了多线程正确的写法。
1.1 第一次作业
1.1.1 类图

其中,main函数是主函数,controller是调度器,用来解决输入并且根据输入给予电梯命令,Elevator是电梯线程,用来解决controller所给的命令。Mam函数是专门用来解决结束方面的类。
1.1.2 复杂度分析


1.1.3 优缺点分析
这次作业写得十分得乱,由于还没有掌握号多线程的思想,因此这次代码写得十分得难看,真的是一点一带用砸东西莽出来的代码。
主要思想是main来启动controller 和Elevatot这两个线程(其实controller和main结合为一体就可以),然后由于这次作业单纯可以一个个送,并且我还没有学会wait和notify的用法(尝试过因当时不理解锁所以放弃了),因此在Elevator类中我用循环一直等待是否有新的输入,若有就莽,没有就用cpu一遍一遍刷。实在是愚蠢。当时对syncronise也不是很理解,于是我对所有的函数都加了一个syncronize。因为不知道为什么不能结束进程,因此我单独写了一个Mam类用来管理是否输入完成,在elevator中判断这个变量总之,这回作业因许多东西还没有学会,写得乱七八糟。
1.2 第二次作业
这一次作业效果明显比第一次要好很多,理解了多线程许多要注意的东西,理解了锁的精妙与危险之处,还学会了wait和notify的使用方法。
1.2.1 类图

Main类为主线程, 完成输入的工作。main会把输入传入到sched(调度器)来解决相应的数据,把它们处理成命令,传入给Elevator线程玩啊成任务。
1.2.2 复杂度分析

(这个purse是之前创过这个类,但最后把他删除了,不知为何这个表里面还是有这个类)

(由于装不下图里,没有显示,其实elevator线程里的run的ev值非常的高,导致模块难以维护、隔离和复用。但是run函数不用复用吧,无所谓吧)
1.1.3 优缺点分析
真的不是自卖自夸,第二次作业进步太大了。第一次作业在一周后看都像在看屎一样,这一次作业相比第一次作业写得有模有样。
这回写得时候思路比较清晰,虽然这也和我采用简单的调度方法有关。一开始,电梯都会判断sched里面是否有指令,没有指令进行wait。已有输入,便notify唤醒电梯。电梯在发现有指令时,直接去找离当前楼层当前楼层最近的电梯,并朝那个方向移动。在路上,只要是方向一致便顺承,只要电梯里面有人就保持方向不变。若电梯里没人了,从新开始一样的操作。
在输入结束之后,电梯会判对输入结束符,队列是否为空,和自身是否在移动来判断结束。
有一个有点就是它的可维护性。由于调度器里的函数都十分的独立,即使加上一些电梯,只需要改一些函数中的判断条件即可,为第三次作业做了个很好的铺垫。
1.3 第三次作业
第三次作业自认为写得十分得舒服,一很是因为有了第二次作业很好的铺垫, 二是因为采用了十分愚蠢效率低下的但是十分好写的调度方法。
1.3.1 类图

大概是把第二次作业改了改,加了一个类专门用来结束进程的类Stop,有点像第一次作业瞎扯的Mam,万万没想到这个会在第三次作业起到作用。
1.3.2 复杂度分析

1.3.3 优缺点分析
首先是缺点,那便是调度的方法太过于简单,虽然代码很好写,但是性能却一般般。虽然尝试过比较复杂的方法,我尝试用枚举来解决问题,但是写着写着心态蹦了,因此最后决定用十分愚蠢直白的方法:在八层以上就在15层转,在八层一下就直接在1层转。
有点:就是代码改变量十分的少,几乎就是在sched中的函数输入加了一些限制条件。在有输入时,先判断可不可以由一个电梯直接送达,若不能直达,便拆成两端,等执行完第一段把处理好的第二段放进队列里。改动大概就是这些,其余的调度方法与作业二没有什么区别,还有就是小地方,如电梯有了人数限制,还有专辑的情况,因此在许多地方加了许多notify。锁用的都是一个锁,我觉得这个是还可以改进的地方。
二、分析程序bug
第一次作业的bug最大的就是程序一复杂就会出现错误,原因是因为不会运用syncronize的用法。在哪里干瞪眼看了好久的代码,经同学指导才明白了自己的许多不足。
第二次作业很顺,没有bug。
第三次作业十分顺利的修改了第二次的作业,但是有一个地方是不能延用第二次作业的地方,就是结束程序的时候。由于很多线程线程十分得忙,想在sched类中通过观察一个变量来判断输入是否结束实在是容易出现问题,因此我直接新建了一个类,类中一个变量来观察是否输入完成。这个地方十分得困扰了我好久。
第三次作业在强测的时候十分得惨,原因是因为一个十分基础地方。我双重循环遍历两个数组时,发现匹配项做删除的操作时,忘记了break来跳出循环,虽然过了弱侧,但是在强测中数据一多便出现了数组越界的问题。一个break扣了我几十分,这完完全全是因为c语言不扎实的原因。
三、发现bug的策略
十分惭愧的是这次互测并不太了解怎么互测,因此自己提交的互测数据都是从0时间把所有数据输入进去。
四、心得体会
这次作业理解到了多线程的复杂。但通过三次作业自己对多线程的理解加深了是事实。这个多线程也让我体验到了多线程代码的乐趣,发现了java的强大,也让我对写代码有了重新的认识,对代码的可能性和他对一些事情处理原理也有了新的理解。自我认为这三次还有许多可以修改的地方,希望自己有时间再好好琢磨琢磨优化一下。
2019北航oo课程第二单元作业总结..#_#..的更多相关文章
- 2019北航OO第三单元作业总结
1.梳理JML语言的理论基础.应用工具链情况 JML基础理论: JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言.JML是一种行为接口规格语言,基 ...
- 北航OO第四单元作业总结(4.1~4.3)及课程总结
前言 在学习过JML规格描述语言之后,本单元进行了UML(Unified Modeling Language)的学习.和JML单纯用语言描述的形式不同,UML通过可视化的图形形式,对一系列有关类的元素 ...
- 北航OO(2020)第二单元博客作业
第二单元第一次作业 多线程设计策略 第一次作业的想法是设计三个线程:输入线程,调度器线程以及电梯线程.输入线程获取请求并发送给调度器线程:调度器线程通过查询电梯线程的状态(等待.停靠以及移动),并综合 ...
- 北航OO第三单元作业总结(3.1~3.3)
JML简介及相关工具链使用 1.JML规格描述语言介绍 本单元学习的内容是JML规格描述语言.我们知道,面向对象方法是一个抽象过程,需求者仅需关注方法的规格.规格是对一个方法/类/程序的外部可感知行为 ...
- BUAA OO 2019 第二单元作业总结
目录 总 架构 controller model view 优化算法 Look 算法 多种算法取优 预测未来 多线程 第五次作业 第六次作业 第七次作业 代码静态分析 UML 类图 类复杂度 类总代码 ...
- 2019年北航OO第1单元(表达式求导)总结
2019年北航OO第1单元(表达式求导)总结 1 基于度量的程序结构分析 量化指标及分析 以下是三次作业的量化指标统计: 关于图中指标在这里简要介绍一下: ev(G):基本复杂度,用来衡量程序非结构化 ...
- OO第二单元作业总结【自我反思与审视】
第二单元作业的完成史,就是一部心酸的血泪史…… 多线程的出现为我(们)打开一片广阔的天地,我也在这方天地摸爬滚打,不断成长!如果说第一单元之前还对Java语法有所了解的话,那么这单元学习多线程则完全是 ...
- 【OO学习】OO第四单元作业总结及OO课程总结
[OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...
- oo第四单元作业总结暨课程总结
oo第四单元作业总结暨课程总结 一.本单元作业架构设计 本单元需要构建一个UML解析器,通过对输入的UML类图/顺序图/状态图的相关信息进行解析以供查询,其中课程组已提供输入整体架构及输入解析部分,仅 ...
随机推荐
- DirectX11 With Windows SDK--25 法线贴图
前言 在很早之前的纹理映射中,纹理存放的元素是像素的颜色,通过纹理坐标映射到目标像素以获取其颜色.但是我们的法向量依然只是定义在顶点上,对于三角形面内一点的法向量,也只是通过比较简单的插值法计算出相应 ...
- Tree POJ - 1741【树分治】【一句话说清思路】
因为该博客的两位作者瞎几把乱吹(" ̄︶ ̄)人( ̄︶ ̄")用彼此的智慧总结出了两条全新的定理(高度复杂度定理.特异根特异树定理),转载请务必说明出处.(逃 Pass:anuonei, ...
- manacher最长回文子串
https://www.luogu.org/blog/codesonic/manacheralgorithm 先放上洛谷的链接,毕竟讲的真好 两道例题 luogu4555 SP7586 inline ...
- 第4章学习小结_串(BF&KMP算法)、数组(三元组)
这一章学习之后,我想对串这个部分写一下我的总结体会. 串也有顺序和链式两种存储结构,但大多采用顺序存储结构比较方便.字符串定义可以用字符数组比如:char c[10];也可以用C++中定义一个字符串s ...
- package.json 里的 dependencies和devDependencies区别
dependencies(依赖的意思): 通过 --save 安装,是需要发布到生产环境的.比如项目中使用react,那么没有这个包的依赖就会报错,因此把依赖写入dependencies devDep ...
- eclipse添加jar包进jar源码debug调试
1.点击调试配置 2.选中源码 3.点击添加 4.点击java路径变量 5.点击环境变量配置 6.输入名称及jar包复制限定名
- 使用Sales_data类
写一段程序程序实现求两次交易相加结果的功能.程序的输入是下面这两条交易记录: 0-201-783456-X 3 20.00 0-201-783456-X 3 25.00 程序的结构如下: #inclu ...
- DC综合简单总结(1)
DC综合简单总结(1) *****************set_dont_touch和set_dont_touch_network**************** ? 在综合的过程中,为了不让D ...
- Input子系统与多点触摸技术-3【转】
转自:https://blog.csdn.net/u012839187/article/details/77335941 版权声明:本文为博主原创文章,欢迎转载,转载请注明转载地址 https://b ...
- UiAutomator2.0 - 控件实现点击操作原理
目录 一.UiObject 二.UiObject2 穿梭各大技术博客网站,每天都能看到一些的新的技术.突然感觉UiAutomator 2.0相对于现在来说已经是个很久远的东西了ε=(´ο`*))).写 ...