学习了之前在写代码是从来没有见过的多线程之后,便迎来了此次电梯作业。说实话,这次作业做得十分的辛苦,虽然在前三次作业中领悟到了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课程第二单元作业总结..#_#..的更多相关文章

  1. 2019北航OO第三单元作业总结

    1.梳理JML语言的理论基础.应用工具链情况 JML基础理论: JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言.JML是一种行为接口规格语言,基 ...

  2. 北航OO第四单元作业总结(4.1~4.3)及课程总结

    前言 在学习过JML规格描述语言之后,本单元进行了UML(Unified Modeling Language)的学习.和JML单纯用语言描述的形式不同,UML通过可视化的图形形式,对一系列有关类的元素 ...

  3. 北航OO(2020)第二单元博客作业

    第二单元第一次作业 多线程设计策略 第一次作业的想法是设计三个线程:输入线程,调度器线程以及电梯线程.输入线程获取请求并发送给调度器线程:调度器线程通过查询电梯线程的状态(等待.停靠以及移动),并综合 ...

  4. 北航OO第三单元作业总结(3.1~3.3)

    JML简介及相关工具链使用 1.JML规格描述语言介绍 本单元学习的内容是JML规格描述语言.我们知道,面向对象方法是一个抽象过程,需求者仅需关注方法的规格.规格是对一个方法/类/程序的外部可感知行为 ...

  5. BUAA OO 2019 第二单元作业总结

    目录 总 架构 controller model view 优化算法 Look 算法 多种算法取优 预测未来 多线程 第五次作业 第六次作业 第七次作业 代码静态分析 UML 类图 类复杂度 类总代码 ...

  6. 2019年北航OO第1单元(表达式求导)总结

    2019年北航OO第1单元(表达式求导)总结 1 基于度量的程序结构分析 量化指标及分析 以下是三次作业的量化指标统计: 关于图中指标在这里简要介绍一下: ev(G):基本复杂度,用来衡量程序非结构化 ...

  7. OO第二单元作业总结【自我反思与审视】

    第二单元作业的完成史,就是一部心酸的血泪史…… 多线程的出现为我(们)打开一片广阔的天地,我也在这方天地摸爬滚打,不断成长!如果说第一单元之前还对Java语法有所了解的话,那么这单元学习多线程则完全是 ...

  8. 【OO学习】OO第四单元作业总结及OO课程总结

    [OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...

  9. oo第四单元作业总结暨课程总结

    oo第四单元作业总结暨课程总结 一.本单元作业架构设计 本单元需要构建一个UML解析器,通过对输入的UML类图/顺序图/状态图的相关信息进行解析以供查询,其中课程组已提供输入整体架构及输入解析部分,仅 ...

随机推荐

  1. 计算机网络Web应用层与运输层(HTTP/TCP)

    应用层协议原理 Web和HTTP DNS:英特网的目录服务 运输层 面向连接的运输:TCP及拥塞原理 一.应用层协议原理 DNS域名解析: (用例:www.baidu.com)域名解析是网络请求的第一 ...

  2. DirectX11--实现一个3D魔方(2)

    前言 上一章我们主要讲述了魔方的构造和初始化.纹理的准备工作.目前我还没有打算讲Direct3D 11关于底层绘图的实现,因此接下来这一章的重点是魔方的旋转.因为我们要的是能玩的魔方游戏,而不是一个观 ...

  3. Excel表格中依据某一列的值,将这列中一样的数据放在一个文件中。

    一需求:按照标题C的内容,一样的数据整理到一个文件中. 二.操作: 1.atl+F11弹出vb窗口 2.点击       插入===>模块   ,复制以下代码,注意这是一个表头为三行的函数(保存 ...

  4. SHELL:多文件的重命名和移动

    rename find mv #实现查找png 和 jpeg文件 #!/bin/bash #file name: rename.sh #use: rename.jpg  and .png files ...

  5. Modbus通讯两种传输方式

    控制器能设置为两种传输模式(ASCII或RTU)中的任何一种在标准的Modbus网络通信.用户选择想要的模式,包括串口通信参数(波特率.校验方式等),在配置每个控制器的时候,在一个Modbus网络上的 ...

  6. react-高阶组件

    1.高阶组件就是一个函数,传给它参数(包括组件,变量等),它返回一个新的组件 2.列如现在有这么个高阶组件,根据传入的参数name,从而从localstore中获得这个name的值,然后更新到传入的参 ...

  7. react项目构建

    1.react脚手架 npm install -g create-react-app create-react-app myproject 2.页面配置(bootcdn) <script src ...

  8. 【译】索引进阶(七):SQL SERVER中的过滤索引

    原文链接:传送门. To be continued...

  9. The Ethereum devp2p and discv4 protocol Part II

    描述 本文章主上下两篇 上篇:讲述以太坊devp2p与disc4节点发现协议 下篇:实践篇,实现如何获取以太坊所有节点信息(ip,port,nodeId,client) 正文 本片为下篇:实践篇,主要 ...

  10. [mysql] 修复问题表Table '.xxxx' is marked as crashed and should be repaired

    程序执行的过程中,出现   Table '.xxxx' is marked as crashed and should be repaired 错误,上网查了一下,原来是表遭到损坏所致,具体修复办法如 ...