oo博客2

一、从多线程的协同和同步控制方面,分析和总结自己三次作业来的设计策略及其变化

  第五次:这次作业我的策略便是读入指令一个线程、调度器一个线程、电梯三个线程,通过调度器线程将读入指令线程读入的指令分配给三个电梯,而三个电梯则一直在运行,检测是否有指令产生。本次作业完全使用synchronized关键字进行同步控制。

  第六次:这次作业因为指导书要求不太明确,我便放弃了读入指令线程这个设计以达到更好地同步控制。我的设计是将指令全部读入后,根据指令数量建立对应的监控线程,这样一来我只需做好监控线程的同步即可,实现起来较为容易。

  第七次:这次作业的设计又变回了第五次作业的设计策略,即读入指令一个线程、调度器一个线程来实现指令的读入与分配,之后让100个出租车成为100个线程自由移动。

二、基于度量来分析自己的程序结构

第五次作业:

  这次作业因为给电梯分配指令时要考虑的因素过多(例如同质和捎带),因此Dispatch类写的过于臃肿,在分配算法上可以继续优化。

  优点:采用Button思路使电梯运行策略变得简单。

  缺点:对于捎带判断思路不清晰导致代码变得臃肿。

  设计原则缺陷:责任均衡分配原则及懂我原则。

第六次作业:

  这次作业由于涉及到线程的类只有Monitor类,导致该类责任过重成为God类。

  优点:线程较少,同步控制容易实现。

  缺点:Monitor类过于庞大,实现较为复杂。

  设计原则缺陷:存在God类,责任分配均衡原则。

第七次作业:

  这次因为调度器类只需要让出租车抢单及派单给出租车即可,因此实现较为容易,避免了方法冗余。

  优点:各类的职责明确,责任均衡,较好地达成了责任分配均衡原则。

  缺点:100个出租车100个线程,稍有不慎便会卡死(例如多层while(true)嵌套)。

  设计原则缺陷:局部化原则。Map对象在很多类中重用了。

三、分析自己程序的bug

  第五次作业:这次作业因为是第一次接触多线程,对synchronized关键字的用法不太熟练,导致指令读入线程和调度器线程存在同步控制问题(无法正确读取指令序列中的指令),导致其余的设计和实现时间严重不足,遗留了很多bug。本次作业我被发现了4个bug,主要还是电梯运行时时间的处理和同质指令判断。因为我的同质指令判断在调度器中完成,而调度器代码过多,导致考虑很不周全,没有做好ER类型指令的同质判断及存在同质判断输出时间不对的问题。

  第六次作业:本次作业被发现了一个在同一文件上实行recover和path-changed触发器后有概率导致找不到文件而crash的bug。这个bug存在的原因是因为在读入指令时该文件存在,但一旦修改文件后,recover会将其改回来,并且导致改名后的文件在path-changed触发器下找不到,而我未想到这种情况,认为读入指令时文件存在便不需考虑文件不存在的问题,因此使用了listfiles方法,但这种情况只能返回null,从而出现了crash。

  第七次作业:这次作业被发现了一个时间输出上的错误。主要是我未考虑到出租车的运行需要微小的时间,运行多了自然会产生偏差。

四、分析自己发现别人程序bug所采用的策略

  这三次作业均未发现别人bug。策略是按照bug树构造指令。

五、心得体会

  这三次多线程作业做完后,我觉得我整个人都上升了一个境界。一是针对大代码量的作业的迅速完成能力的提升,二是针对问题提出设计的能力的提升,三便是不屈不挠的毅力。尤其是多线程电梯作业,因为对多线程完全陌生,导致同步控制完全没做,因此出现了神奇的情况——就算添加指令和分配指令是对同一个指令序列进行的操作,他就是无法正确执行,而是像玩捉迷藏一样偶尔正确执行一次。这真是差点让我放弃,不过后来认真学习了synchronized关键字的用法后,这个问题便迎刃而解了,剩下的只有一个下午以及还没开始写的电梯类(心累),也导致遗留了很多bug。不过熟悉了同步控制方法后,接下来的两次作业我都做得得心应手,也没有被同学挑出来线程安全方面的问题。第六次作业做完我最大的感受便是——都跟你说了要try-catch,因为我过于自信(其实是没想到)自己的逻辑,导致recover触发器的一些问题没有考虑周全,出现了文件不存在的指针错误。第七次作业让我明白了假时间的好处,我在输出出租车运行时间时只是简单地输出了系统时间/100,但没考虑到出租车运行一段时间后会有误差这一问题,导致出现了出租车运行时间间隔为300ms的错误,在稍微用假时间修改后,该问题得以解决。

原文地址:https://www.cnblogs.com/xyt1606/p/8976018.html

时间: 2024-10-10 17:53:13

oo博客2的相关文章

小菜鸡儿的第三次OO博客

规格化设计历史 规格化设计的历史目前网上的资料并不多,百度谷歌必应也表示无能为力...... 在这里结合现实情况讲一讲自己对程序规格化的理解,首先代码规格化对代码的影响是间接的,或许它不能让你代码里面的bug直接消失,或许它也不能让电梯之间不相互阻塞,但是它能让OO实验拿到更多分啊//笑.玩笑归玩笑,下面具体分析一下规格化设计(JSF为例)的作用: 在代码实现过程中,人们往往不能从一开始对整个项目的每个细节都面面俱到地思考一遍,规格化设计在开发初期可以将项目中的细节隐去,工程师只需要考虑类or包

OO博客作业2:第5-7周作业总结

(1)从多线程的协同和同步控制方面,分析和总结自己三次作业来的设计策略及其变化. 第5次作业:多线程电梯 基本照搬了课件上"生产者-消费者"模型的设计策略,将InputHandler设计为生产者线程,将Scheduler设计为消费者线程,将RequestQueue设计为托盘.生产者与消费者的工作并发,提高效率.同时,每部电梯设计为一个线程,因为每部电梯的运行彼此不干扰.InputHandler, Scheduler由主线程创建,三部电梯由Scheduler负责创建,这样使得调度器可以获

接着继续(OO博客第四弹)

.测试与JSF正确性论证 测试和JSF正确性论证是对一个程序进行检验的两种方式.测试是来的最直接的,输入合法的输入给出正确的提示,输入非法的输入给出错误信息反馈,直接就能很容易的了解程序的运行情况.但是,每次测试只是在程序涉及的整个问题空间取一个元素进行测试,一次测试只能确保程序对于测试中的样例和同类样例是正确的,并不能确保全局正确性.而为了追求全局覆盖性,就需要大规模的测试样例轰炸了,但是这时测试的最致命缺陷就出现了,一是如何构造如此大量且属于不同类别的测试样例,二是如何确保构造的测试样例能够

设计与实现分离——面向接口编程(OO博客第三弹)

如果说继承是面向对象程序设计中承前启后的特质,那么接口就是海纳百川的体现了.它们都是对数据和行为的抽象,都是对性质和关系的概括.只不过前者是纵向角度,而后者是横向角度罢了.今天呢,我想从设计+语法角度说一说我感受到的面向接口编程,从而初探设计与实现分离的模式. (本文所使用的面向对象语言为java,相关代码都是java代码) 设计--接口抽象设计 继承的思想很容易理解,提取几类相近数据中的公共部分为基类,各个独立部分在基类的基础上做自己专属的延伸.接口是抽象概括输入和输出,而具体的实现交由具体实

oo第三次博客总结

1.规则化发展历史 形式化方法的研究高潮始于20世纪60年代后期,针对当时所谓"软件危机",人们提出种种解决方法,归纳起来有两类:一是采用工程方法来组织.管理软件的开发过程:二是深入探讨程 序和程序开发过程的规律,建立严密的理论,以其用来指导软件开发实践.前者导致"软件工程"的出现和发展,后者则推动了形式化方法的深入研究.经过30多 年的研究和应用,如今人们在形式化方法这一领域取得了大量.重要的成果,从早期最简单的形式化方法一阶谓词演算方法到现在的应用于不同领域.不

软工_结对项目总结博客

关于结对编程 第一次进行真正的结对编程,而且我们组又是最奇葩的三人组合(14061183韩青长)(14061195陈彦吉),在经历了三天的合作以后,感觉收获还是蛮多的,下面是我对于结对编程的一些个人体验. 优点 在结对编程的过程中,两个人共同面对同一份代码,编码时旁边时刻有人提示监督.这样写出的代码,首先考虑的特殊情况会更多,能避免很多一个人编程时因为考虑不周而在某个不起眼的地方产生的Bug,代码质量更高,少了很多调试时间. 同时,由于两个人交替工作,一方面可以缓解疲劳,同时又因为身旁有人共同工

第零次博客作业

第一部分:结缘计算机 1. 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?(必答) 当年高考前在专业这件事上纠结了好久,因为我对于大学各个专业具体学什么都不甚了解,于是就迟迟没有明确的目标,可以说整个高三自己一直都是迷茫的状态,就这样一直保持到了高考.我当年高考是先出成绩,后填报志愿,等到成绩出来之后发现意外地比期望要高,而北航应该是最适合我的学校了.身为一个比较"宅"的理科男,我当时打算将专业锁定在"数学"."计算机"."

PageRank 计算博客园用户排名

PageRank 通过网页与网页之间的链接关系计算各网页权重,一般权重高的网页特点是:链接向它的网页数量多.链向它的网页其权重也较高.PageRank 就是通过这样的连接关系,一轮轮迭代计算后得出各网页的权重. 思路拓展一下,其实人与人之间也是连接着的,在社会的人际关系网中,每个人的社会地位和身价也是不同的.以微博为例,我们都有关注者和粉丝(类似网页之间的链接),可以发现所谓的“大V”基本上粉丝数量多,并且粉丝里不乏很多其他“大V”,所以这个帐号的价值就大. 同样博客园也具有类似的社交关系,用户

面向对象编程思想 - 月亮晶石的日志 - 网易博客

面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计. 它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统).这可以使系统直接地映射问题域,保