1. 程式人生 > >exp: 物件池化

exp: 物件池化

可以利用apache commons-pool2自定義物件池。

看個例子,https://blog.csdn.net/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中。

更細緻講解見:https://www.cnblogs.com/jinzhiming/p/5120623.html