OO第二阶段总结

OO第二阶段开了新坑,可以说难度又上了一个新的高度,导致我又要面临的一到两个星期的学习与适应多线程的编程方法。

第五次作业还好,是在原有的比较完善的电梯系统的基础上引入多线程,但为了实现项目要求却也颇具周折。

第五次作业

第五次作业为了保证多线程之间的原子性与互斥,直接新建了一个shareData类来统一管理所有共享的数据,使用synchronized加锁,通过get()和set()方法来实现数据的获取与修改,这样便于操作而且由于数据都在shareData中定义,安全性更高,缺点就是对get()和set()方法加锁,会导致程序执行效率降低。所以从第五次作业明显可以感觉到多线程编程方法的复杂之处。

由于是第一次写多线程程序的缘故,花费了大量的时间在多线程上,而对电梯的调度上就乏善可陈,最终公测与互测的结果也说明了情况,在同质的判断以及电梯的调度上出现了错误。多线程电梯的调度并非和单线程电梯的调度相同,更具挑战性。其实为了简化程序结构调度器可以“放权”,让每部电梯都有一个子调度器,在子调度器上实现每部电梯基本的调度策略,而这次我直接使用了GOD调度器,一个调度器包打天下,这样就导致了threadScheduler类及其复杂而且效果并不好,有种囫囵吞枣的感觉。这从类图中也可以看出来。

第六次作业

也许是电梯写多了,突然第六次作业要求进行文件监控,有种“一脸懵”的感觉。所以,第六次作业的公测结果很不理想,错的点特别多,而且基本的项目要求都没有实现:对文件目录的监控。

从类图中也可以看出来,各个类之间关系混乱,甚至写完之后都有一种凑结果的感觉。首先就是File类的重写,确实是一个挑战,纠结了好长时间,构造方法里到底该不该构建一个File?重写后的方法是直接使用构建的File还是作为参数传入的File?着实纠结的很长时间,最后还是在构造方法里构建了File,和原File类保持一致,这就导致了一个新问题,就是如果针对一个文件创建了多个SafeFile指针就会导致线程同步问题,解决办法就是在main函数里针对一个文件定义一个SafeFile执政,这又导致main函数功能过多,还有部分SafeFile定义在了Snapshot里,和main函数功能又重复了,后面又要处理线程同步问题,总之就是千丝万缕,这里一茬,那里一茬,无善可陈。这次Project深刻的告诉我:写之前动动脑子,想好各类之间什么关系,每个类该怎么写在动键盘。

第七次作业

有了第六次作业的教训,写第七次作业就轻松了许多。

从类图中可以看到,各类之间的关系清晰了许多,也没有出现GOD类的情况,说到GOD类,这次互测分配到的作业着实让我大吃一惊,他的Scheduler出租车调度类太GOD了,即要调度,还有进行输入处理,还要在里面创建电梯,这个就让人丈二和尚摸不着头脑,多建几个类只是东东手指的事,不必在一个类里面处理那么多东西吧!虽然最后结果挺好,但这个设计问题不能忍。这次作业使用了线程安全的SafeFile类,taxi的数据统一由TaxiData类进行管理,我觉得这次处理的比较好的地方就是调度类,大胆的尝试了在子线程下创建子子线程,也实现了线程的同步,另一个比较好的地方就是完全去掉了MagicNumber统一使用final定义的全局变量,程序看上去协调了许多。但缺点就是吧,调度类多干了一件事,由于默认所以taxi能抢单100%抢单,就在调度类里面直接检索能抢单的taxi,略去了抢单的过程,可能会在后面的程序设计中留下隐患。

从上面几次作业看来,对多线程编程由浅入深,已经初步掌握了多线程编程的技巧和方法,对数据的保护也比较到位,虽然中间有挫折而且乏善可陈,但毕竟一步一个脚印走过来,还是收获良多的。

posted @ 2018-05-02 20:33  Nipo  阅读(151)  评论(0编辑  收藏  举报