由于创建对象需要消耗一定得资源,在程序中用对象池来保存常用的对象,可以节省创建对象的开支。Apache commons-pool提供了GenericObjectPool,一个比较常用的资源池,它会控制资源总数量,和空闲资源数量。
使用方法:
- 继承基础对象池工厂类BasePoolableObjectFactory;
- 实现其抽象方法makeObject();
- 利用GenericObjectPool类得构造方法构造对象池得实例(它得构造方法有很多种,具体可以查看commons-pool api 地址:http://commons.apache.org/proper/commons-pool/apidocs/index.html);
- GenericObjectPool类常用得几个方法如下: borrowObject() : 从对象池中获得一个对象;addObject() : 创建一个新得实例,放入对象池中; returnObject() : 将获取到得对象还回对象池中;
例:
1. 实现一个自己需要得对象池工厂
1 public class MyObjectPoolFactory extends BasePoolableObjectFactory{ 2 3 //这里实现类BasePoolableObjectFactory中得抽象方法makeObject,用来给自己得对象池工厂中构造所需得对象 4 5 @Override 6 7 public Object makeObject() throws Exception { 8 9 MyObject mo = new MyObject(); 10 11 mo.setId("1"); 12 13 mo.setName("test"); 14 15 return mo; 16 17 } 18 19 }
2.获取对象池对象从里面获取对象
1 GenericObjectPool pool = new GenericObjectPool(new MyObjectPoolFactory(), 20); 2 3 for(int i=0; i<21; i++){ 4 5 MyObject mo = (MyObject)pool.borrowObject(); //此处从对象池中获取一个对象,可以使用该对象做自己所需得操作 6 7 System.out.println(mo.hashCode()); //此处打印出获取到得对象得hashCode,由于每个对象得hashCode都是唯一得。但是这里打印出得hashCode值是一样得,因为后面将对象还了回去,所以每次取到得都是同一个对象。如果后面不执行returnObject操作,则此处打印出得hashCode是不同得。 8 9 pool.returnObject(mo); //此处将对象还回对象池 10 11 }