在最近一个月的面向对象编程学习中,咱们进入了编写多线程程序的阶段。线程的建立、调度和信息传递,共享对象的处理,线程安全类的编写,各类有关于线程的操做在必定程度上增长了近三次做业的复杂度与难度,带来了不小的考验。本文经过分析总结近三次做业的完成状况,分享我对与多线程编程的一些看法与体会。算法
实现具备捎带功能的电梯调度系统,调度电梯数量为3部。编程
时序图:数组
本次做业的问题主要出如今如下两个方面:安全
本次做业使第一次编写多线程程序。因为对于每一个线程的运行过程的理解不足,我在最初的程序构架时遇到了比较大的困难。尤为是在共享类中锁的运用以及线程类的run方法的功能的设计上,经历了屡次删除重写的过程。在必定程度上,这致使了我在类的设计、调度算法设计等方面有了很多疏忽。最终使得本次做业的完成效果通常。此外,在线程调度方面,本次做业较好的运用了课内讲的模型。经过此次的锻炼,我对于多线程编程的大致框架有了比较深入的认识,为接下来的学习打下了铺垫。数据结构
实现IF-THIS-THEN-THAT的文件监控与操做系统。多线程
通过分析,程序大体分为文件快照获取、监控事件触发、监控事件任务执行三部分。并发
具体类图以下:框架
时序图:学习
数据统计:测试
复杂度分析:
分析:
在构造文件系统的遍历树是采用了一维的线性数据结构,每次获取快照时都须要按深度递归遍历监控范围内的全部文件,致使获取快照的相关方法的复杂度较高。在优化的方面,能够考虑改用集合类中的树结构或者哈希表的方式对监控范围内的文件进行预处理(如编码),减少以后的工做量。此外还能够直接使用现有库中的获取快照的方法。
本次做业的问题主要出如今文件地址的管理方面。在程序中,每一个文件都使用的是绝对地址格式。绝对地址有多种可识别格式,但经过File类提供的方法从File对象中获取的绝对地址仅有一种格式。因为在先后快照对比是经过字符串比较实现的,因此可能因为格式问题致使错误。将格式同一后能够解决。
在本次做业中最重要的部分就是文件信息的同步。因为文件操做是线程不安全的,因此在完成做业的过程当中,我用了至关多的时间在设计线程安全类和快照获取功能上,最终得到了不错的效果。但在类功能的设计上还显得有些冗杂,有挺大的改进空间。
实现100辆出租车的抢单调度系统。
乘客的请求:
乘客请求的响应窗口:
出租车:
维护出租车信息的更新。
维护出租车集合。
系统与乘客之间交互相对独立,因为只由控制台输入,使用一个线程设计用于与控制台输入交互。
出租车的行为具备显著的重复模式,而且相对独立,使用一种线程设计,分别描述每一辆出租车行为。
对于获取的乘客请求的处理与分配具备重复性,而且相对独立,使用一种线程设计来实现功能。
信息输出相对独立,使用一个线程实现。
具体类图以下:
时序图:
数据统计:
复杂度分析:
分析:
在测试阶段个人程序没有被发现问题。可是在本身检查的时候发现了很多的潜在问题:
出租车管理:在本次做业中,我为了简单将全部的出租车都管理在了同一个数组中,将出租车状态保存在了出租车各自的对象中。若是能将不一样状态的出租车分离,用不一样的策略去管理,则可以使程序的延展性更高。
通过了这三次的多线程编程做业,经过分析做业中的问题,我对于线程的调度与线程的安全有了至关深刻的认识。从宏观上来看,每一个线程都在同时运行,但微观上看他们是在JVM的调度之下按原子操做交替执行。若是每一个线程间相互独立,JVM调度的不肯定性不会影响程序的可再现性。但就像电梯中的请求队列、IFTTT中的文件信息、出租车系统的请求和出租车信息,每一个线程间难以免地会有共享的数据,此时就须要经过同步、互斥的手段防止JVM调度的不肯定性破坏程序的可再现性。一般,经过锁机制就可以实现这些功能。可是,在共享关系比较复杂的状况下,单纯的使用锁机制并不必定可以达到预期的效果。这时就须要一种模式化的线程安全保护措施。那就是线程安全类。编写线程安全类就比如为已有的功能代码加上一层外皮,其内部代码保证功能的实现,外部接口保证入口的互斥,从而实现线程安全。但这又带来了另外一个问题:同步部分的代码长度对多线程效率的影响。进而对于临界区的功能安排应当尽可能精简,以免对多线程机制的浪费。
此外,通过了对面向对象思想的学习,我认识到了面向对象程序设计的12大基本原则,而且将其实践到最近的一次做业当中。在亲自编写代码的过程当中,我体会到这些原则最核心的想法就是:设计具备层次性、代码具备可延展性。在设计时就要从最外层的交互设计,一层层深刻,到内部对象的建模、对象间交互,再到类内部的设计。这个设计就是对整个环境与系统的逐层深刻,将各个功能逐层分离,最终造成相似树状的类设计。而在编写代码的时候不该当仅关注于当前的功能实现,更应当想到更多同类型的操做。换句话说就是编写出的方法、类不该当进可以实现特例操做,而更应当面向更为抽象、更为通用的层次上。