今天终于看到最后的视频了,张老师讲解关于《交通灯管理系统》、《银行业务调度系统 》两个面试题目的分析和设计。
张老师讲解地址:《交通灯管理系统》http://blog.csdn.net/zhangxiaoxiang/archive/2011/03/24/6273384.aspx
《银行业务调度系统 》http://blog.csdn.net/zhangxiaoxiang/archive/2011/04/01/6294132.aspx
通过张老师的讲解我们看得见做一个软件项目的简要过程。
仔细分析项目的需求,可以通过作图来辅助分析,抽象出来类、对象等,然后根据现实中的逻辑来实现项目中的逻辑。
下面介绍下我在这个项目中关注的两个要点:
1.面向对象的需求与分析
OOAD(Object Orient Analysis & Design,面向对象的分析和设计,面向对象分析与设计)是现代软件企业广为采用的一项有效技术。OOAD方法要求在设计中要映射现实世界中指定问题域中的对象和实体,例如:顾客、汽车和销售人员等。这就需要设计要尽可能地接近现实世界,即以最自然的方式表述实体。所以面向对象技术的优点即为能够构建与现实世界相对应的问题模型,并保持他们的结构、关系和行为为模式。
通俗的来讲面向对象是指,我们考虑问题时,把任何东西看做是对象,以对象为单位,考虑它的属性及方法。
好比一个木匠在做一把凳子,如果他是面向过程的木匠,他会想到制作凳子的过程。“先做什么呢?凳子腿?凳子板?用什么工具呢?”。如果他是一个面向对象的木匠,他会把所有的东西看做成对象,“凳子腿,凳子板两个对象。凳子腿有属性,长方体的,长度,宽度是多少厘米,有方法钉钉子。凳子板的属性,正方形,边长是多少厘米等等问题。”这样的话,面向对象的木匠会依据这些条件。将一个凳子组装在一起。最终目的是做成一个凳子。
面向对象的木匠会对事务量化的分析,用“数学”的方法处理问题似的。这样更具有进步意义。面向对象的思想也确实有着他的先进之处,它把世界上的所有事务看做成为对象,这样的话更贴近于现实世界,使得逻辑更加清晰,对项目设计拥有积极地进步意义。
2.jdk1.5的新特性 线程池
线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
keepAliveTime: 线程池维护线程所允许的空闲时间
unit: 线程池维护线程所允许的空闲时间的单位
workQueue: 线程池所使用的缓冲队列
handler: 线程池对拒绝任务的处理策略
一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。
当一个任务通过execute(Runnable)方法欲添加到线程池时:
如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
也就是:处理任务的优先级为:
核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:
NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。
workQueue我常用的是:java.util.concurrent.ArrayBlockingQueue
handler有四个选择:
ThreadPoolExecutor.AbortPolicy()
抛出java.util.concurrent.RejectedExecutionException异常
ThreadPoolExecutor.CallerRunsPolicy()
重试添加当前的任务,他会自动重复调用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy()
抛弃旧的任务
ThreadPoolExecutor.DiscardPolicy()
抛弃当前的任务
线程池的资料来源:http://blog.csdn.net/robage/archive/2007/05/22/1620691.aspx