第二次博客总结

 

在第二阶段的OO作业中,我们的面向对象涉及到了新的知识--多线程,这几次的作业相较于前几次的作业来说,难度上有了一定的提升,代码长度上来说,也有了一定的增长,知识层面上,也有了一定的扩展。通过这几次的作业,仍然感到自己对于程序的设计仍有很多考虑不到的地方,还需继续努力。

第五次作业

第五次的作业我没能完成,为无效作业。在这一次的作业中,相较于以往,差别真的很大,首先在以往的作业中,我们都是事先将所有请求加入到请求队列中,而在这次的作业中,要求模拟真实时间,实时对请求进行操作,这使之前的调度器毫无作用,只能重新设计。还有就是多线程的理解与应用,第五次的作业是首次接触到多线程,在这次的作业中,我对多线程的线程设计安全理解不够深,没能理清其中的思路,因此在这次的设计中出了很大问题,导致作业无效。这次的作业也给了我一次教训,以后一定谨记此次教训,不犯相同错误。

第六次作业

度量图

 

类图

 

时序图

 

第六次的作业是对文件进行监控,当文件进行一定的修改时,若修改操作与监控器监控操作一致时,便触发相应的任务。

在这次的作业中,对于从控制台输入的IFTTT请求,创建一个相应的监控器,每个监控器对应一个线程,而线程之间共享的资源为监控的文件。各个线程需要获取文件信息,对文件进行修改等操作,因此会出现线程不安全的问题。针对于这个问题,需要设计一个SafeFile类,此类中包含对文件的各种操作,并且通过锁的方式将各个有可能造成线程安全问题的方法锁起来。在监控作业的实现上,我实现的方式是每个线程对各自的监控范围进行扫描,并将信息与已有的信息进行对比,如果发生了线程对应的监控操作,则进行相应的操作。而这些查询,修改操作之间都是加了锁,线程安全的。

在这次的作业中,我感觉由于指导书上很多地方都没有明确指出,导致有很多地方存在理解会出现差错,虽然最后在交流群里,在issue上有问题的解答,但浪费了很多时间。

在这次的作业中,由于最后时间不足,因此,对于监控对象为目录的情况没有加上去,而且在对文件重命名等判断操作上理解不清,因此导致了一些错误。在互测阶段,我分配的作业完成情况很好,没有出现明显bug。

第七次作业

度量图

 

类图

 

时序图

 

第七次的作业是模拟城市中,对于出租车相应请求的程序,是出租车系列作业的第一次作业,主要是模拟在城市地图中,若出现请求,调度器将按照一定的规律将请求派发给相应的出租车。

这次的作业比较前两次较为简单。对于100个出租车,每个出租车为一个线程,各自互不相关的工作。对于请求,我的做法是对于每一个输入的请求,都开一个周期大约为3000ms的线程,每个线程的的属性为请求类的一个对象,请求类中包含有请求的目的点与发出点。线程每隔大约100ms对所有出租车进行扫描,查看若有符合要求出租车,即加入抢单队列。之所以为大约100ms,是因为,线程的时间会有误差,误差累计后可能会造成错误现象,因此每sleep一次即进行一次矫正。当线程最后结束时,即在抢单队列中找出最适合的出租车发派请求。这样,100个出租车为共享资源,请求线程的扫描队列与发派请求可能会造成线程不安全,加锁即可。

在这次的作业中,由于在对输入请求进行判断的时候发生差错,因此导致对原本应判断为无效指令的请求判断为有效,进行了处理。互测阶段分配到的作业,由于未对任何有效指令做出正常回应,因此被判为无效。

总结与体会

通过这三次的作业,首先,主要是对多线程和线程安全的问题上有了更多的了解,通过锁,将共享资源锁起来,使不同的线程在使用共享资源时能够不产生冲突。

其次,在代码方面,我在网上借鉴了很多大神的代码后,发现一定要使每一个类,每个方法不能够太过庞大,庞大就意味着难以发现问题,同时十分丑陋,同时将代码简化也可以使代码中可重复部分减少。

最后,一定要对程序负责,在任何情况下都不能使程序crash,在很多情况下都要考虑到所有情况。

原文地址:https://www.cnblogs.com/fyd123/p/8980480.html