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的强大,也让我对写代码有了重新的认识,对代码的可能性和他对一些事情处理原理也有了新的理解。自我认为这三次还有许多可以修改的地方,希望自己有时间再好好琢磨琢磨优化一下。

posted @ 2019-04-24 17:47  yupobo  阅读(274)  评论(0编辑  收藏  举报