总结性博客作业

第一次作业

(1)从多线程的协同和同步控制方面,分析和总结自己三次作业的设计策略。

第一次作业为单电梯傻瓜调度,可以采用生产者——消费者模型,是一个有一个生产者(标准输入电梯请求),一个消费者(电梯),中间的托盘共享数据为请求队列的模型。由于电梯没有容量限制,因此生产者生产的请求可以实时加入到请求队列中。消费者(电梯)每次从请求队列中取出一个请求并执行。只需要保证对请求队列的操作互斥就可以了。由于elevator的结束条件是input结束并且请求队列为空,所以elevator需要感知input是否结束,对此采取将input线程作为elevator的一个数据成员,这样就可以使用input.isAlive()来判断input线程是否结束。

(2)基于度量来分析自己的程序结构度量类的属性个数、方法个数、每个方法规模、每个方法的控制分支数目、类总代码规模计算经典的OO度量画出自己作业的类图,并自我点评优点和缺点,要结合类图做分析通过UML的协作图(sequence diagram)来展示线程之间的协作关系(别忘记主线程)从设计原则检查角度,检查自己的设计,并按照SOLID列出所存在的问题

(3)分析自己程序的bug分析未通过的公测用例和被互测发现的bug:特征、问题所在的类和方法特别注意分析哪些问题与线程安全相关关联分析bug位置与设计结构之间的相关性

第一次没有踩到bug。

(4)分析自己发现别人程序bug所采用的策略列出自己所采取的测试策略及有效性,并特别指出是否结合被测程序的代码设计结构来设计测试用例分析自己采用了什么策略来发现线程安全相关的问题分析本单元的测试策略与第一单元测试策略的差异之处

第一次也没有检查到别人的bug

(5)心得体会从线程安全和设计原则两个方面来梳理自己在本单元三次作业中获得的心得体会

只需要对共享数据的操作进行互斥就可以了。

第二次作业

(1)从多线程的协同和同步控制方面,分析和总结自己三次作业的设计策略。

第二次作业为单电梯ALS调度,仍旧可以采用生产者——消费者模型。

与第一次作业的区别在于:

  1. 电梯到了某一层楼后,需要检索请求队列中所有请求,取出其中能够被电梯捎带的请求,并放入电梯的loader队列里面。
  2. 第二次作业对CPU时间进行了限制,所以再采取轮询的方式获取请求是不行的。必须使用wait,notify方法。在请求队列为空并且没有输入的时候,让电梯线程wait,当再次有输入的时候让输入线程去唤醒电梯线程,这样做有效减少了CPU时间。
  3. input与elevator是两个平等的对象,将input作为elevator的数据成员是不合理的,因此设置一个共享变量hasInput,初值设置为true,当hasInput为true的时候,电梯线程就不会结束。只有当Input线程结束,由Input线程将hasInput设置为false,并且当请求队列为空的时候,电梯线程才能结束。

(2)基于度量来分析自己的程序结构度量类的属性个数、方法个数、每个方法规模、每个方法的控制分支数目、类总代码规模计算经典的OO度量画出自己作业的类图,并自我点评优点和缺点,要结合类图做分析通过UML的协作图(sequence diagram)来展示线程之间的协作关系(别忘记主线程)从设计原则检查角度,检查自己的设计,并按照SOLID列出所存在的问题

(3)分析自己程序的bug分析未通过的公测用例和被互测发现的bug:特征、问题所在的类和方法特别注意分析哪些问题与线程安全相关关联分析bug位置与设计结构之间的相关性。

自己的bug在于elevator的run方法少写了一行listout,导致有些人没有出电梯。

(4)分析自己发现别人程序bug所采用的策略列出自己所采取的测试策略及有效性,并特别指出是否结合被测程序的代码设计结构来设计测试用例分析自己采用了什么策略来发现线程安全相关的问题分析本单元的测试策略与第一单元测试策略的差异之处

测试策略是自己编写边界数据。

(5)心得体会从线程安全和设计原则两个方面来梳理自己在本单元三次作业中获得的心得体会

从第二次作业中,我踩到一个巨坑。那就是不能notify没有获得锁的线程,一旦notify没有获得锁的线程,就会报错。所以要写成这样:

synchronized(共享数据){

notify();

}

第三次作业

(1)从多线程的协同和同步控制方面,分析和总结自己三次作业的设计策略。

第三次作业为多电梯调度,还是采用生产者——消费者模型。

与第二次作业不同的地方在于,由于是多电梯,不光生产者与消费者对共享数据的操作要互斥,消费者与消费者之间对共享数据的操作也要互斥。

请求队列采用二维Arraylist模型,只有每个一维Arraylist的第一个任务可以被电梯接受,每次电梯执行完一个请求就将它从请求队列中移除。

(2)基于度量来分析自己的程序结构度量类的属性个数、方法个数、每个方法规模、每个方法的控制分支数目、类总代码规模计算经典的OO度量画出自己作业的类图,并自我点评优点和缺点,要结合类图做分析通过UML的协作图(sequence diagram)来展示线程之间的协作关系(别忘记主线程)从设计原则检查角度,检查自己的设计,并按照SOLID列出所存在的问题

(3)分析自己程序的bug分析未通过的公测用例和被互测发现的bug:特征、问题所在的类和方法特别注意分析哪些问题与线程安全相关关联分析bug位置与设计结构之间的相关性

mainrequest进入电梯导致超载。我的架构是mainrequest独立于请求队列而存在,因此主请求进入时电梯人数忘了加1。

(4)分析自己发现别人程序bug所采用的策略列出自己所采取的测试策略及有效性,并特别指出是否结合被测程序的代码设计结构来设计测试用例分析自己采用了什么策略来发现线程安全相关的问题分析本单元的测试策略与第一单元测试策略的差异之处

测试策略是猜想哪些地方可能出错,针对性的编写边界测试数据来测试自己程序,debug时采用打印中间信息的方式。

(5)心得体会从线程安全和设计原则两个方面来梳理自己在本单元三次作业中获得的心得体会

由于有些请求不能直达,需要拆分,而拆分的方式又有很多种,而电梯又是根据请求队列来运行的,所以在请求得到时就要进行拆分,我这里采用了傻瓜拆分策略,先看A能否直达,再依次看B,C,再看AB组合,AC,BC依次检索。这里的拆分策略就是一个可以优化的点。

多线程的bug有时候不能复现,所以一组测试数据需要多测几次。

自己写的测试程序的时间不一定是标准的,可以采用研讨课大佬同学讲的标准化时间来输入。

转载于:https://www.cnblogs.com/Luocx/p/10755477.html

OO第二单元作业小结相关推荐

  1. 【OO学习】OO第二单元作业总结

    OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...

  2. BUAA OO第二单元作业总结

    一.作业设计策略 (一)第一次作业设计方案 模型:生产者消费者模型 两个线程:输入线程(生产者).电梯线程(消费者) 共享对象:请求队列 退出模式:输入线程读到null,退出run,并将null传入请 ...

  3. OO第二单元作业分析

    前言 这一单元关于线程安全的作业结束了,在助教提供的接口的帮助以及老师提供的设计模型的指导下,这三次作业还是相对轻松地完成了,中间也没有出现什么bug,可能就是因为简单的逻辑不容易出错吧,可惜两次都由 ...

  4. OO第二单元作业总结

    一:设计策略 第一次作业:第一次是单电梯傻瓜调度策略,因此我把调度器当作共享资源对象,有一个put和一个get方法,因为只有一个电梯,并且单次取出和投放一个请求,因此只需要同步控制一下这两个方法是互斥 ...

  5. 多线程编程初探——OO第二单元作业回顾

    一.作业设计策略 1)执行FAFS策略的单部电梯 ​ 由于对多线程不是很了解,于是采用了理论课上介绍的生产者消费者模型作为设计模板(也是很多同学一开始的做法):将请求队列作为共享对象(托盘),名为In ...

  6. 面向对象课程第二单元作业总结

    面向对象课程第二单元作业总结 前言 电梯系列作业分为三个阶段,逐步深入实现越来越复杂的电梯运行状态模拟. 第一阶段实现单部多线程傻瓜调度(FAFS)电梯的模拟: 第二阶段实现单部多线程可捎带调度(AL ...

  7. OO第一单元作业总结

    OO第一单元作业总结 第一次作业 结构 OO第一次作业是简单的多项式求导,在这次多项式求导中,仅包含了幂函数和带符号整数的一些简单求导运算.在经过自己的一些简单分析后,我认为第一次作业最重要的部分是判 ...

  8. OO第二单元(电梯)单元总结

    OO第二单元(电梯)单元总结 OO第一单元(求导)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉理解和掌握多线程的思想和方法.这个单元以电梯为主题,从一开始的最简单的单部傻瓜调 ...

  9. BUAA OO 第二单元总结

    OO 第二单元总结 本文为OO 第二单元电梯作业总结,本单元主要是掌握多线程和线程安全.三次作业总的架构类似,可分为输入线程.调度线程.电梯线程.三次作业的增量迭代如下 第五次作业 六部电梯 第六次作 ...

最新文章

  1. c++用二叉树表示代数表达式_C语言:数据结构-二叉树的定义和基本术语和二叉树的性质...
  2. linux下载哪个python版本-修改linux下python的默认版本
  3. 考公务员的本科学历可以考吗
  4. JQuery 分割函数(split)的用法和定义
  5. 成功解决ValueError: Cannot feed value of shape (1, 10, 4) for Tensor Placeholder:0 , which has shape
  6. 华为上架自主地图应用Here WeGo 或登录HMS系统成为预装应用
  7. linux libimf.so,如何安装Linux版FLOW-3D及注意事项
  8. 在ClassWizard无法显示添加的类解决方法(转载)
  9. 递归函数 二分查找法 的一些用法
  10. 190328每日一句 When you forgive, you release.
  11. xshell查看hdfs文件目录路径_hdfs的shell操作
  12. 扁平化设计-扁平化与拟物设计对比
  13. sql中简简单单明明白白得使用 with temp as (select x from table1)
  14. AddressSanitizer: heap-buffer-overflow on address 0x602000000534 at pc 0x00000040699d bp 0x7ffce0afd
  15. 一文彻底解决An error occurred while creating the AVD. See idea.log for details问题
  16. 《王煜全创新生态报告12讲》学习笔记
  17. win10计算机启动慢,win10开机慢?如何使开机破8秒
  18. 百度砸120W年薪,只要这个专业,应届生也行!
  19. [摘]用Java生成Word文档
  20. 歪门邪道之解决首屏图片加载闪烁问题

热门文章

  1. irq4中断子程序c语言写法,AVR汇编程序参考
  2. html meta页面自适应,【转载·收藏】 html5手机网站自适应需要加的meta标签
  3. ACM试题 - ASCII码排序 - Java中字符与对应ASCII码的转换
  4. 本机在合成图片经常提示内存不足
  5. 李国浩20179307第二周作业
  6. hadoop二次排序
  7. PHP图形图像的典型应用 --常用图像的应用(验证码)
  8. 关于不同用户进入系统报错的请求
  9. 一天的学习成果:hash输出,dcache工作原理,include的home directory,fist optype的含义...
  10. LeetCode—216. 组合总和 III