標籤:java apache pool
2013年,Apache Commons Pool 2.0 發布,這是一個完全重寫的對象池的實現。實現的代碼和原來差異很大,原來的一些例子就不能用了。按照上面的例子,用pool2的類和方法重寫下。
ApacheCommons Pool 2.0 代碼如下:
package test.ffm83.commons.pool;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericObjectPool;
/**
* commons pool的簡單實用,基於2.x版本
* 1. Factory BasePooledObjectFactory
* 2. Pool的配置 就是pool
* 3. Pool執行個體 Resource
* @author範芳銘
*/
public classPool2BaseUsage {
public static void main(String[] args) {
finalGenericObjectPool<Resource> pool =new GenericObjectPool<Resource>(
newTestPoolableObjectFactory());
pool.setMaxTotal(2);
for (int i = 0; i < 6; i++) {
new Thread(new Runnable() {
@Override
publicvoid run() {
try {
Resourceobj = pool.borrowObject();//注意,如果對象池沒有空餘的對象,那麼這裡會block
System.out.println(StringUtils.rightPad(obj.toString()+",擷取對象", 50,"-"));
Thread.sleep(5000);
pool.returnObject(obj);//歸還串連池資源
System.out.println(StringUtils.leftPad(obj.toString()+",歸還對象", 50,"-"));
}catch(Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
/**
* commons pool的簡單實用,基於2.x版本
* 1.x的 BasePoolableObjectFactory類修改為 BasePooledObjectFactory
* @author範芳銘
*/
static classTestPoolableObjectFactory extends BasePooledObjectFactory<Resource>{
@Override
public Resource create()throws Exception {
return new Resource();
}
@Override
publicPooledObject<Resource> wrap(Resource resource) {
return newDefaultPooledObject<Resource>(resource);
}
/**
* When an object is returned to the pool,clear the buffer.
*/
@Override
public voidpassivateObject(PooledObject<Resource> resource) {
//resource.getObject().setRid(-1);
}
}
static class Resource {
public static int id;
private int rid;
public Resource() {
synchronized (this) {
rid = id++;
}
}
public int getRid() {
returnrid;
}
public void setRid(int rid){
this.rid = rid;
}
@Override
public String toString() {
SimpleDateFormatdf = newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設定日期格式
Stringstr = df.format(newDate()) +","+ "id:"+rid;
return str;
}
}
}
運行效果如下:
2014-12-19 15:51:58,id:1,擷取對象---------------------
2014-12-19 15:51:58,id:0,擷取對象---------------------
2014-12-19 15:52:03,id:0,擷取對象---------------------
---------------------2014-12-1915:52:03,id:0,歸還對象
---------------------2014-12-1915:52:03,id:1,歸還對象
2014-12-19 15:52:03,id:1,擷取對象---------------------
---------------------2014-12-1915:52:08,id:0,歸還對象
2014-12-19 15:52:08,id:0,擷取對象---------------------
---------------------2014-12-1915:52:08,id:1,歸還對象
2014-12-19 15:52:08,id:1,擷取對象---------------------
---------------------2014-12-1915:52:13,id:0,歸還對象
---------------------2014-12-1915:52:13,id:1,歸還對象
Apache Commons Pool2串連池代碼