可以利用apache commons-pool2自定义对象池。
看个例子,https://blog.youkuaiyun.com/qq447995687/article/details/80233621
有个实体类T,工厂类TFactory,运行池类TPool
工厂类作用?有哪些方法?
析:创建实体对象 create() ;
把对象池化,是对对象的一个包装,加上了对象的一些其他信息,包括对象的状态(已用、空闲),对象的创建时间等。
@Override
public PooledObject<T> wrap(T t) {
return new DefaultPooledObject<>(t);
}
。。。等等
只有被池化的对象才可以放进pool里从池子里进行借还!!
运行池类TPool作用?
析:Pool类的构造方法里有factory和对pool配置的config信息,也就是pool将生产池化对象PooledObject的任务交给factory,pool里可以myPool.borrowObject();myPool.returnObject(。。)等
参考:https://www.cnblogs.com/jinzhiming/p/5120623.html
GenericObjectPool原理?
数据结构:ConcurrentHashMap和LinkedBlockingDeque。
前者用于存储所有的对象(不含销毁的对象),后者用于存储前面使用过目前空闲的对象。
borrowObject()大体思路如下
1 从LinkedBlockingDeque中pollFirst
2 若为空,检查对象池对象是否达到上限,若是重复1,若否,则调用PooledObjectFactory的makeObject去创建一个对象
3 得到对象之后,对对象进行初始化和一些配置的计数处理,同时将对象加入到ConcurrentHashMap。
returnObject(T obj)大体思路如下
1 根据obj从ConcurrentHashMap拿到其对应的PooledObject p
2 判空;将p状态置为RETURN
3 若getTestOnReturn参数为true,进行validateObject
4 对p进行passivateObject,与初始化相反
5 更新p状态为IDLE
6 归还Pool:Pool的idle实例达到上限或者Pool已经关闭,销毁之,否则将p加入到LinkedBlockingDeque中。