改造上一篇的代码,实现了KeyedObjectPool.
对象池实现类:
package com.my.pool.pooledobject; import org.apache.commons.pool2.KeyedObjectPool; public class KeyedPooledStringBuffer { private KeyedObjectPool<String,StringBuffer> pool; public KeyedPooledStringBuffer(KeyedObjectPool<String,StringBuffer> pool) { this.pool = pool; } public boolean print(String key,String data) { boolean flag = false; if(pool!=null&&key!=null) { StringBuffer buf = null; try{ buf = pool.borrowObject(key); buf.append(data); System.out.println(buf.toString()); return true; }catch(Exception e) { e.printStackTrace(); }finally { try { if(buf != null) { pool.returnObject(key, buf); } } catch (Exception e) { e.printStackTrace(); } } } return flag; } }
工厂类:
package com.my.pool.pooledobject; import org.apache.commons.pool2.BaseKeyedPooledObjectFactory; import org.apache.commons.pool2.PooledObject; import org.apache.commons.pool2.impl.DefaultPooledObject; /** * 先创建,后打包 * */ public class KeyedPooledStringBufferFactory extends BaseKeyedPooledObjectFactory<String,StringBuffer>{ @Override public StringBuffer create(String key) throws Exception { StringBuffer buf = new StringBuffer(); //根据key的不同进行不同的操作 if("hello".equals(key)) { buf.append(key); buf.append("\t"); }else { //Do nothing. } return buf; } @Override public PooledObject<StringBuffer> wrap(StringBuffer obj) { return new DefaultPooledObject<StringBuffer>(obj); } @Override /** * 归还后调用的方法 */ public void passivateObject(String key,PooledObject<StringBuffer> pooledObject) { StringBuffer buf = pooledObject.getObject(); buf.setLength(0); if("hello".equals(key)) { buf.append(key); buf.append("\t"); }else { //Do nothing. } } }
主类:
package com.my.pool.main; import org.apache.commons.pool2.impl.GenericKeyedObjectPool; import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig; import com.my.pool.pooledobject.KeyedPooledStringBuffer; import com.my.pool.pooledobject.KeyedPooledStringBufferFactory; public class KeyedMainClass { public static void main(String[] args) { GenericKeyedObjectPoolConfig config = new GenericKeyedObjectPoolConfig(); //最长等待分配时间 config.setMaxWaitMillis(1000l); //每种key池内最多对象数 config.setMaxTotalPerKey(100); //每种key池内最大空闲数目 config.setMaxIdlePerKey(20); //每种key池内最小空闲数目 config.setMinIdlePerKey(10); GenericKeyedObjectPool<String,StringBuffer> pool = new GenericKeyedObjectPool<String,StringBuffer>(new KeyedPooledStringBufferFactory()); KeyedPooledStringBuffer bufUtil = new KeyedPooledStringBuffer(pool); bufUtil.print("hello","OK"); bufUtil.print("else","OK"); } }
KeyedObjectPool和ObjectPool的区别在于对于输入的key可以做不一样的操作,甚至获得不同的线程池。本例是在创建的时候,加入了一些字符,并在回收之后把前缀又写回去。不同的用法,可以自己发挥想象。
评论