ObjectPool定義了一個簡單的池化接口,有三個對應實現
GenericObjectPool:實現了可配置的後進先出或先進先出(LIFO/FIFO)行爲,默認是做爲一個後進先出隊列,這意味當對象池中有可用的空閒對象時,borrowObject 將返回最近的對象實例,若是將lifo 屬性設置爲false,則按FIFO行爲返回對象實例。
StackObjectPool :實現了後進先出(LIFO)行爲。
SoftReferenceObjectPool: 實現了後進先出(LIFO)行爲。另外,對象池還在SoftReference 中保存了每一個對象引用,容許垃圾收集器針對內存須要回收對象。
KeyedObjectPool定義了一個以任意的key訪問對象的接口(能夠池化對種對象),有兩種對應實現。
GenericKeyedObjectPool :實現了先進先出(FIFO)行爲。
StackKeyedObjectPool : 實現了後進先出(LIFO)行爲。
PoolableObjectFactory 定義了池化對象的生命週期方法,咱們能夠使用它分離被池化的不一樣對象和管理對象的建立,持久,銷燬。
BasePoolableObjectFactory這個實現PoolableObjectFactory 接口的一個抽象類,咱們可用擴展它實現本身的池化工廠。
一個對象池使用的簡單例子:
package tf; import org.apache.commons.pool.BasePoolableObjectFactory; import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.impl.StackObjectPool; public class Pool { public static void main(String[] args) throws Exception { ObjectPool pool = new StackObjectPool(new UserFactory()); User u = (User) pool.borrowObject(); // 從池中借出一個對象 u.setName("me"); u.sayHello(); pool.returnObject(u); // 歸還對象 } static class UserFactory extends BasePoolableObjectFactory { /** * 產生一個新對象 */ public Object makeObject() { return new User(); } /** * 還原對象狀態 */ public void passivateObject(Object obj) { User u = (User) obj; u.clear(); } } static class User { String name; void setName(String name) { this.name = name; } void sayHello() { System.out.println("hello, " + name); } void clear() { name = ""; } } }