java对象池ObjectPool

来源:互联网 发布:excel数据录入程序 编辑:程序博客网 时间:2024/05/16 07:25
 Java化工Apache配置管理
commons-pool提供了一套很好用的对象池组件。使用也很简单,不过对一些简单的对象使用对象池就没必要了。

ObjectPool定义了一个简单的池化接口,有三个对应实现 
GenericObjectPool:实现了可配置的后进先出或先进先出(LIFO/FIFO)行为,默认是作为一个后进先出队列,这意味当对象池中有可用的空闲对象时,borrowObject 将返回最近的对象实例,如果将lifo 属性设置为false,则按FIFO行为返回对象实例。
StackObjectPool :实现了后进先出(LIFO)行为。
SoftReferenceObjectPool: 实现了后进先出(LIFO)行为。另外,对象池还在SoftReference 中保存了每个对象引用,允许垃圾收集器针对内存需要回收对象。

KeyedObjectPool定义了一个以任意的key访问对象的接口(可以池化对种对象),有两种对应实现。
GenericKeyedObjectPool :实现了先进先出(FIFO)行为。
StackKeyedObjectPool : 实现了后进先出(LIFO)行为。

PoolableObjectFactory 定义了池化对象的生命周期方法,我们可以使用它分离被池化的不同对象和管理对象的创建,持久,销毁。
BasePoolableObjectFactory这个实现PoolableObjectFactory 接口的一个抽象类,我们可用扩展它实现自己的池化工厂。

一个对象池使用的简单例子:
Java代码  
  1. package tf;   
  2.   
  3. import org.apache.commons.pool.BasePoolableObjectFactory;   
  4. import org.apache.commons.pool.ObjectPool;   
  5. import org.apache.commons.pool.impl.StackObjectPool;   
  6.   
  7. public class Pool {   
  8.   
  9.     public static void main(String[] args) throws Exception {   
  10.         ObjectPool pool = new StackObjectPool(new UserFactory());   
  11.         User u = (User) pool.borrowObject(); // 从池中借出一个对象  
  12.         u.setName("me");   
  13.         u.sayHello();   
  14.         pool.returnObject(u); // 归还对象   
  15.     }   
  16.   
  17.     static class UserFactory extends BasePoolableObjectFactory {   
  18.         /**  
  19.          * 产生一个新对象  
  20.          */  
  21.         public Object makeObject() {   
  22.             return new User();   
  23.         }   
  24.   
  25.         /**  
  26.          * 还原对象状态  
  27.          */  
  28.         public void passivateObject(Object obj) {   
  29.             User u = (User) obj;   
  30.             u.clear();   
  31.         }   
  32.     }   
  33.   
  34.     static class User {   
  35.         String name;   
  36.   
  37.         void setName(String name) {   
  38.             this.name = name;   
  39.         }   
  40.   
  41.         void sayHello() {   
  42.             System.out.println("hello, " + name);   
  43.         }   
  44.   
  45.         void clear() {   
  46.             name = "";   
  47.         }   
  48.     }   
  49. }  
原创粉丝点击