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类图/顺序图/状态图的相关信息进行解析以供查询,其中课程组已提供输入整体架构及输入解析部分,仅 ...
随机推荐
- IDEA2019激活码集合(非盈利)
56ZS5PQ1RF-eyJsaWNlbnNlSWQiOiI1NlpTNVBRMVJGIiwibGljZW5zZWVOYW1lIjoi5q2j54mI5o6I5p2DIC4iLCJhc3NpZ25lZ ...
- XML配置spring session jdbc实现session共享
概述 session的基础知识就不再多说. 通常,我们会把一个项目部署到多个tomcat上,通过nginx进行负载均衡,提高系统的并发性.此时,就会存在一个问题.假如用户第一次访问tomcat1,并登 ...
- SQL SERVER服务器登录名、角色、数据库用户、角色、架构的关系
原创链接:https://www.cnblogs.com/junfly/articles/2798023.html SQL SERVER 基础教程中关于服务器登录名.服务器角色.数据库用户.数据库角色 ...
- vue+element-ui实现显示隐藏密码
<template> <el-form :model="cuser_info" label-width="115px" label-posit ...
- centos7-aliyun
# 安装EPEL和IUS软件源 yum install epel-release -y yum install https://centos7.iuscommunity.org/ius-release ...
- 浅入深出Vue:环境搭建
浅入深出Vue:环境搭建 工欲善其事必先利其器,该搭建我们的环境了. 安装NPM 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版本的NodeJS Windows安装程序 下载下来后,直 ...
- windows下搭建Kafka,并通过命令窗口收发消息
参考网址: https://blog.csdn.net/ydc321/article/details/70154278 前提条件:windows环境需要安装jdk 1.下载Kafka,可以通过官网下载 ...
- linux 性能分析
1.系统状态工具:sysstat, 包含很多监控linux系统状态的工具,pidstat 安装方法: sudo apt-get install sysstat 2.性能优化工具: perf 安装方法: ...
- [转] 图解Seq2Seq模型、RNN结构、Encoder-Decoder模型 到 Attention
from : https://caicai.science/2018/10/06/attention%E6%80%BB%E8%A7%88/ 一.Seq2Seq 模型 1. 简介 Sequence-to ...
- # 20175333曹雅坤《Java程序设计》第五周学习总结
教材学习内容总结 第六章要点: 1.接口:1)接口声明: interface //接口的名字 2)接口体 2.实现接口:类实现接口:一个类需要在类声明中使用关键字implements声明该类实现一个或 ...