轉自:http://reallyafei.iteye.com/blog/372893
commons-pool提供了一套很好用的對象池組件。使用也很簡單,不過對一些簡單的對象使用對象池就沒必要了。
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 = "";
- }
- }
- }