commons-pool2 5 - 对象池实现demo

说明

这里实现一个简单的demo
之前介绍概念时,主要介绍了
pooledObject,pooledObjectFactory,objectPool

这里复用:
默认的objectPool即GenericObjectPool
pooledObject也复用默认的

自己写的是
pooledObject中被包装类
pooledObjectFactory

BigObj,用来模拟难以创建,但是可以复用的大对象

package pooling;

public class BigObj {
    static int id = 0;
    int v;
    BigObj() {
        this.v = id++;
        System.out.println("create " + v);
    }
    public void destroy() {
        System.out.println("destroy " + v);
    }

    public int getV() {
        return v;
    }
}

BigObjFactory,即pooledObjectFactory
这里注意,pooledObjectFactory#validateObject随机通过

package pooling;

import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;

import java.util.Random;

public class BigObjFactory implements PooledObjectFactory<BigObj> {
    @Override
    public PooledObject<BigObj> makeObject() throws Exception {
        return new DefaultPooledObject<BigObj>(new BigObj());
    }

    @Override
    public void destroyObject(PooledObject<BigObj> pooledObject)
            throws Exception {
        pooledObject.getObject().destroy();
    }

    @Override
    public boolean validateObject(PooledObject<BigObj> pooledObject) {
        //默认是false,代表验证不通过,这里随机好了
        return new Random().nextInt()%2==0;
    }

    @Override
    public void activateObject(PooledObject<BigObj> pooledObject)
            throws Exception {
    }

    @Override
    public void passivateObject(PooledObject<BigObj> pooledObject)
            throws Exception {
    }
}

Main进行测试

package pooling;

import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

public class Main {

    public static void main(String[] args) throws Exception {
        GenericObjectPoolConfig conf = new GenericObjectPoolConfig();
        conf.setMaxTotal(5);
        conf.setTestOnReturn(true);
        GenericObjectPool<BigObj> pool = new GenericObjectPool<BigObj>(new BigObjFactory(), conf);
        for(int i =0;i< 10; i++) {
            BigObj bigObj = pool.borrowObject();
            System.out.println(i + " time get " + bigObj.getV());
            pool.returnObject(bigObj);
        }
    }
}

结果

create 0
0 time get 0
destroy 0
create 1
1 time get 1
2 time get 1      //第1次 归还1的时候验证通过,继续服用
destroy 1          //第2次 归还1的时候验证不通过,destroy掉
create 2
3 time get 2
destroy 2
create 3
4 time get 3
destroy 3
create 4
5 time get 4
destroy 4
create 5
6 time get 5
7 time get 5
destroy 5
create 6
8 time get 6
destroy 6
create 7
9 time get 7
destroy 7

思考

1.代码主要管理需要被包装的,需要池复用的类

2.poolObject以及objectPool需要根据需要自己复现,一般情况下复用默认的即可

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容