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类图/顺序图/状态图的相关信息进行解析以供查询,其中课程组已提供输入整体架构及输入解析部分,仅 ...
随机推荐
- Linux之 proc文件系统
用户态与内核态交互的接口之一,管理方式与普通文件相同每个节点的文件权限(读/写)决定其查看和配置权限大量LINUX系统参数和状态信息可通过proc节点查看或配置/proc/<pid>/:查 ...
- trackerClient.getConnection()为null
如题,整了个fastDFS文件服务器.但是集成项目spring boot时上传文件失败! Debug到trackerClient.getConnection()时为null.于是看了服务器上track ...
- maven项目导入依赖jar包并打包为可运行的jar包
1.在pom.xml文件中添加插件 <build> <finalName>LeadServer</finalName> <!-- jar包名前缀,如果没有指定 ...
- http升级https的时候,遇到一个问题
问题: Mixed Content: The page at 'https://api.xxxx.com/test' was loaded over HTTPS, but requested an i ...
- -source 1.5 中不支持泛型(请使用-source5或更高版本)
Idea中maven--compile时报错 -source 1.5 中不支持泛型(请使用-source5或更高版本) 解决办法 在项目的pom.xml中,添加 <build> & ...
- 【vue】渲染大量数据时性能优化
对应vue渲染大量数据时可以考虑下面几点: 1. 异步渲染组件:因为组件渲染太多,影响页面的渲染时间,所有可以延迟组件渲染,可以考虑v-if处理 2. 可以使用虚拟滚动的组件:参考使用这个插件 vue ...
- java平台学习笔记
java程序从编写源码开始到程序执行一共有三个阶段,编写期,编译期,运行期. 通常,人们都希望自己的程序更快(不仅仅是执行更快,也有编写更快),因此java在不断更新. java源码先通过javac编 ...
- mina statemachine解读(二)
这里主要讲下对外接口暴露的处理. // 创建对外接口对象 TaskWork taskWork = new StateMachineProxyBuilder().setStateContextLooku ...
- 机器学习基石12-Nonlinear Transformation
注: 文章中所有的图片均来自台湾大学林轩田<机器学习基石>课程. 笔记原作者:红色石头 微信公众号:AI有道 上一节课介绍了分类问题的三种线性模型,可以用来解决binary classif ...
- HDMI热插拔检测原理
HDMI(19Pin)/DVI(16 pin)的功能是热插拔检测(HPD),这个信号将作为主机系统是否对HDMI/DVI是否发送TMDS信号的依据.HPD是从显示器输出送往计算机主机的一个检测信号.热 ...