• 学前教育
  • 小学学习
  • 初中学习
  • 高中学习
  • 语文学习
  • 数学学习
  • 英语学习
  • 作文范文
  • 文科资料
  • 理科资料
  • 文档大全
  • 当前位置: 雅意学习网 > 语文学习 > 正文

    基于J2SE5.0的对象池组件设计|proe5.0组件教程

    时间:2018-12-23 19:47:50 来源:雅意学习网 本文已影响 雅意学习网手机站

      摘要:Java 2 Standard Edtion 5.0(代号Tiger)是Sun Microsystems公司最新发布的Java2平台标准版。在J2SE5.0中提供了java.util.concurrent包。这个包实现了JSR166中描述的并发编程(concurrent programming)模型。
      本课题中将通过使用J2SE5.0中的concurrent包实现一个标准的对象池来对J2SE5.0并发控制效率进行研究,并将实现的对象池应用在Web程序当中,构建一个扩展Struts框架的Web程序框架。
      本文分两个个主要部分讲解。第一部分讲述了开发对象池及Web框架锁必备的知识,重点讲述Java语言及UML建模;第二部分讲述了对象池组件的系统设计,包括需求分析,组件设计等。
      关键词:对象池 UML建模 Sturts框架
      
      1 基本理论
      
      1.1 Java语言简介
      Java是1995年6月由Sun Microsystems公司提出的一种革命化语言,与其他编程语一样,这种语言在短时间内即得到了迅速的发展。由于具有易用性、平台无关性、易移植性等诸多特征,这门语言得到了广泛的应用。而且,这种语言具有很好的发展前景:程序开发费用少,工作效率高,并拥有很好的用户界面和强大的开发工具。网上数据编程体现得非常充分,是其它语言无法做到的。
      1.2 UML技术
      1.2.1 UML简介
      统一建模语言(UML)是一个通用的可视化建模语言,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档。它记录了对必须构造的系统的决定和理解,可用于对系统的理解、设计、浏览、配置、维护和信息控制。
      UML描述了一个系统的静态结构和动态行为。UML将系统描述为一些离散的相互作用的对象,并最终为外部用户提供一定的功能的模型结构。静态结构定义了系统中的重要对象的属性和操作,以及这些对象之间的相互关系。动态行为定义了对象的时间特性和对象为完成目标而相互进行通信的机制。从不同但相互联系的角度对系统建立的模型可用与不同的目的。
      1.2.2 UML图
      1.2.2.1 类图
      类图表示不同的实体(人、事物和数据)如何彼此相关,换句话说,它显示了系统的静态结构。类图可用于表示逻辑类,逻辑类通常就是业务人员所谈及的事物种类――摇滚乐队、CD、广播剧;或者贷款、住房抵押、汽车信贷以及利率。类图还可用于表示实现类,实现类就是程序员处理的实体。实现类图或许会与逻辑类图显示一些相同的类。然而,实现类图不会使用相同的属性来描述,因为它很可能具有对诸如Vector和HashMap这种事物的引用。
      1.2.2.2 状态图
      状态图表示某个类所处的不同状态和该类的状态转换信息。有人可能会争论说每个类都有状态,但不是每个类都应该有一个状态图。只对“感兴趣的”状态的类(也就是说,在系统活动期间具有三个或更多潜在状态的类)才进行状态图描述。
      1.2.2.3 活动图
      活动图表示在处理某个活动时两个或者更多类对象之间的过程控制流。活动图可用于在业务单元的级别上对更高级别的业务过程进行建模,或者对低级别的内部类操作进行建模。根据我的经验,活动图最适合用于对较高级别的过程建模,比如公司当前在如何运作业务,或者业务如何运作等。这是因为与序列图相比,活动图在表示上“不够技术性”,但有业务头脑的人们往往能够更快速地理解它们。
      1.2.2.4 序列图
      序列图显示具体用例(或者是用例的一部分)的详细流程。它几乎是自描述的,并且显示了流程中不同对象之间的调用关系,同时还可以很详细地显示对不同对象的不同调用。
      序列图有两个维度:垂直维度以发生的时间顺序显示消息/调用的序列;水平维度显示消息被发送到的对象实例。
      1.2.2.5 组件图
      组件图提供系统的物理视图。它的用途是显示系统中的软件对其他软件组件(例如,库函数)的依赖关系。
      1.2.2.6 用例图
      用例图描述了系统提供的一个功能单元。用例图的主要目的是帮助开发团队以一种可视化的方式理解系统的功能需求,包括基于基本流程的“角色”(actors,也就是与系统交互的其他实体)关系,以及系统内用例之间的关系。用例图一般表示出用例的组织关系――要么是整个系统的全部用例,要么是完成具体功能(例如所有安全管理相关的用例)的一组用例。要在用例图上显示某个用例,可绘制一个椭圆,然后将用例的名称放在椭圆的中心或椭圆下面的中间位置;要在用例图上绘制一个角色(表示一个系统用户),可绘制一个人形符号。角色和用例之间的关系使用简单的线段来描述。
      1.2.2.7 部署图
      部署图表示该软件系统如何部署到硬件环境中。它的用途是显示该系统不同的组件将在何处物理地运行,以及它们将如何彼此通信。因为部署图是对物理运行情况进行建模,系统的生产人员就可以很好地利用这种图。
      1.3 开发工具Eclipse
      Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。Eclipse本身附带了一个标准的插件集,包括Java开发工具(Java Development Tools,JDT)。
      Eclipse是一个很让人着迷的开发环境,它提供的核心框架和可扩展的插件机制给广大的程序员提供了无限的想象和创造空间。目前网上流传相当丰富且全面的开发工具方面的插件,但是Eclipse已经超越了开发环境的概念,可以想象Eclipse将成为未来的集成的桌面环境。目前的Eclipse本身就具备资源管理和外部程序的功能,加上无所不能的插件,将构成一个丰富多彩的工作环境而不仅仅是一个IDE。
      
      2 对象池组件分析与概要设计
      
      2.1 概要
      恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率。
      对象池化的基本思路是:将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,从而在一定程度上减少频繁创建对象所造成的开销。用于充当保存对象的“容器”的对象,被称为“对象池”(Object Pool,或简称Pool)。
      对于没有状态的对象(例如String),在重复使用之前,无需进行任何处理;对于有状态的对象(例如StringBuffer),在重复使用之前,就需要把它们恢复到等同于刚刚生成时的状态。由于条件的限制,恢复某个对象的状态的操作不可能实现了的话,就得把这个对象抛弃,改用新创建的实例了。
      并非所有对象都适合拿来池化――因为维护对象池也要造成一定开销。对生成时开销不大的对象进行池化,反而可能会出现“维护对象池的开销”大于“生成新对象的开销”,从而使性能降低的情况。但是对于生成时开销可观的对象,池化技术就是提高性能的有效策略了。
      
      2.2 需求分析
      2.2.1 对象池组件功能需求
      对象池为客户线程提供取得对象的方法getObject,归还对象的方法releaseObject和销毁对象的方法invalidateObject。
      图1 是客户线程从池中取对象时的序列图,当客户线程取对象时对象池根据情况去从池中取对象或调用Factory创建一个对象。在取对象同时对象持还会根据设置调用Factory对对象进行检查,激活或状态复原。
      
      图2是客户线程将对象送回对象池中时的序列图,当客户线程送回对象到对象池时。在取对象同时对象池还会根据设置调用Factory对对象进行检查和状态复原。
      图3是客户进程销毁一个对象时的序列图。当客户线程销毁对象时,对象池将调用Factory的destroyObject方法将对象破坏掉。 
      2.2.2 对象池(ObjectPool)组件性能需求
      对对象池的要求如下:
      1) 对象池组件运行在多线程环境下,要考虑对象池的线程安全性;
      2) 对象池提供三种(increasing,bloking,blocking&timeout)取得对象的方法;
      3) 对象池在创建时对其初始化,并可以在对象池运行过程中可以修改运行参数;
      4) 在对象池内部使用泛型(Generics)技术为各种类型对象构造一个通用的pool。
      2.3 开发环境配置
      2.3.1 硬件环境
      
      2.3.2 软件环境
      1) 开发环境
      
      2) 运行环境
      
      2.4 系统设计
      2.4.1 对象池(ObjectPool)组件
      创建PoolableObjectFactory接口,使开发人员通过实现该接口将指定对象池化;创建一个PoolableObjectFactory接口基类,在接口的实现中也可以继承该基类以节省开发量。
      创建一个通用的对象池CommonObjectPool类,该类通过调用PoolableObjectFactory接口可以实现对象的池化,从池中取对象,将对象归还到池中,检验和销毁一个对象的功能。
      在实现CommonObjectPool时需要考虑代码的线程安全性,以保证对象池的健壮性和效率。
      2.4.2 对象池组件UML图
      对象池组件的类图如图4,其中:
      接口ObjectPool中定义了开发人员使用对象池时可用的接口。
      BaseObjectPool类是对接口ObjectPool的一个基本实现,开发者可以通过继承这个实现来创建自己所需的特定功能的对象池。
      CommonObjectPool是我们创建的一个通用的对象池组件,它继承了BaseObject,该组件满足了以上我们的对象池组件开发要求。该类的各个属性和方法定义如下:
      属性:
      a. MaxActivate:最大活跃对象数目,在非INCREASE型对象池中决定了最多可以使用的对象的数目。如果小于零则为无限。
      b. MaxIdle:最大空闲数,控制对象池中最多有多少个空闲对象;该属性也决定了对象池容器的大小。
      c. MinIdle:最小空闲数,保持对象池中最少的空闲对象数量。
      d. 最大活动数MaxActivate:最多可提供的对象数目。
      e. PoolTYPE {INCREASE,BLOCK,TIMEOUT}:对象池类型。分为:INCREASE(对象池空时可以继续创建对象);BLOCK(对象池空时阻塞调用线程,抛出异常);TIMEOUT(对象池空时,阻塞对象一段时间,直到超时抛出超时异常)。
      f. MaxWaitTime:设置超时类型时,线程每次等待的时间。
      g. MaxWait:超时等待时等待线程的最大数目。
      h. NumWhileEvict:设置evictor执行时需要检测对象的数目。
      i. CheckWhileIdle:标示是否校验对象池中空闲的对象。
      j. TestOnGet:从池中取对象时是否需要校验对象。
      k. TestOnRelease:向池中归还对象时是否需要校验对象。
      l. TimeOutOnEvict:Evictor检测对象池时,池中对象的生命周期。
      方法:
      a. getObject:从对象池中取得一个对象。
      b. releaseObject:将一个对象归还到对象持中。
      c. ivalidateObject:将取出的对象销毁。
      d. clean:清空对象池。
      e. close:关闭对象池。
      f. evict:对池中的对象进行检测,将过期对象破坏掉。
      g. addObjectToPool:向池中加入对象。
      h. addObject:新建一个对象放入池中。
      i. ensureMinIdle:确保池中对象数目的最小值。
      j. startEvictor:启动后台维护线程。
      PoolableObjectFactory是可池化对象的接口,开发者可以通过实现该接口使得指定对象被对象池进行池化。
      BasePoolableObjectFactory是PoolableObjectFactory接口的一个简单实现,开发者可以通过继承该类来池化特定的对象。
      Evictor是CommonObjectPool中的内部线程类,该类负责创建一个后台维护进程以保证对象池的正常运行。
      TimeStampPair是CommonObjectPool中的内部线程类,它是为存放对象并记录对象时间信息的。
      
      结束语
      
      通过利用J2SE5.0提供的新特性实现对象池CommonObjectPool及其在Web应用程序中的应用,我们不仅对对象持技术有了很深的了解,而且在性能的测试与比较中对J2SE5.0对并发控制效率的提高有了一定的验证。
      尽管我们的CommonObjectPool只是个试验中的组件,扩展的Struts框架还有一些不足,但是其应用前景还是相当看好的。经过对我们的扩展框架的进一步完善,我相信开发人员能够基于该框架轻松地开发出稳定性好效率高的Web应用程序。
      
      参考文献:
      [1]Doug Lea.Java并发编程-设计原则与模式(第二版).中国电力出版社,2003-10-1.
      [2][美]格兰德.Java企业设计模式.电子工业出版社,2003-8-1.
      [3]Paul Hyde.Java线程编程.人民邮电出版社,2003-11-1.
      [4]Bruce Eckel.Java 编程思想.机械工业出版社,2002-8-9.
      [5][美]布拉德利.Java程序设计教程.电子工业出版社,2003-7-1.
      [6]李云山.深入浅出Java语言程序设计.中国青年出版社,2003-9-1.
      [7]孙卫琴.Tomcat与Java Web开发技术详解.电子工业出版社,2004-8-1.
      [8]邵维忠.UML用户指南.机械工业出版社,2001-6-1.
      [9]王行言.Java语言与面向对象程序设计.清华大学出版社,2000-9-1.

    推荐访问:组件 对象 设计 J2SE5

    • 文档大全
    • 故事大全
    • 优美句子
    • 范文
    • 美文
    • 散文
    • 小说文章