创建资源池(对象池)

程序中许多资源的使用是有限制的,比如数据库连接,线程等。如果要对这些资源的创建和分配进行有效管理,则需要建立资源池也即对象池。

         资源池的功能是提供对象和回收对象。和普通对象工厂不同的是,它还有以下职责:确保创建的资源数不能大于最大值(如果有最大值的话);确保空闲资源不能过多;在没有空闲资源的时候,做应该做的事,比如报错或者让线程等待。

         虽然它的实现并不复杂,但是作为java开发人员,我们也不需要自己实现了。因为apache的commons-pool-<版本号>.jar包里面的类已经帮我们实现了此功能。我们只要实现资源的工厂类就可以了。

         类介绍:

         ·StackObjectPool:不控制资源个数的资源池。

    ·GenericObjectPool:是一个比较常用的资源池,它会控制资源总数量,和空闲资源数量。

    ·SoftReferenceObjectPool:允许java垃圾回收器回收资源对象的资源池。

   

    使用举例:

    例如,有一种资源(MyObject)需要被对象池管理起来。那么我们只要创建一个工厂类MyObjectFactory就可以了。

    代码如下:

  1. import org.apache.commons.pool.BasePoolableObjectFactory;  
  2. public class MyObjectFactory extends BasePoolableObjectFactory {  
  3.     int count=0;  
  4.     @Override  
  5.     public Object makeObject() throws Exception {  
  6.         // TODO Auto-generated method stub  
  7.         MyObject o=new MyObject();  
  8.         o.name=(count++)+"";  
  9.         return o;  
  10.     }  
  11. }  

得到资源池的代码如下:

ObjectPool pool=new GenericObjectPool(new MyObjectFactory(),20)

上面得到的资源池,最多可以提供20个资源对象。

之后程序中就可以用“MyObject mo=(MyObject)pool.borrowObject() 来代替“new MyObject()”了。

 

同时apachepool组件定义了标准的接口,很方便我们扩展。比如,需要这样一个对象池,它管理3种对象。比如“苹果对象”、“梨对象”、“桔子”,要求根据不同的参数得到不同的对象,但是3种对象的数量之和不超过50。jar包中没有现成的对象池类,但是只要我们实现了poo的标准接口,依然可以像GenericObjectPool一样方便的使用。 

原文地址:https://www.cnblogs.com/daichangya/p/12959280.html