日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

commons

 360lec 2017-05-02

一、背景介紹

    創(chuàng)建新的對象并初始化的操作,可能會消耗很多的時間。在需要頻繁創(chuàng)建并使用這些對象的場景中,為了提供系統(tǒng)性能,通常的做法是,創(chuàng)建一個對象池,將一定數(shù)量的對象緩存到這個對象池中。需要使用時直接從對象池中取出對象,使用完后將對象扔回到對象池中即可。Apachecommons pool組件是我們實現(xiàn)對象池化技術(shù)的良好助手。

二、組件基本介紹 

該項目是一個基本的對象池組件;Pool提供三個主要方面對象池的API:

a)  一個提供客戶方和實現(xiàn)方用來實現(xiàn)簡單、可變的對象池的基本接口。

b)  一個用來創(chuàng)建模塊化對象池的工具。

c)  幾個通用的對象池的實現(xiàn)。

 

三、組件特點

    org.apache.commons.pool包定義了一部分在創(chuàng)建一個新的對象池實現(xiàn)時十分有用的接口和基本類。

四、對象池

    (1)ObjectPool    

    ObjectPool定義了一個簡單小巧的池化接口,主要有GenericObjectPool、StackObjectPool、SoftReferenceObjectPool三個實現(xiàn)類;

    a)GenericObjectPool:可配置LIFO/FIFO行為的ObjectPool的實現(xiàn)。默認采用LIFO隊列方式。這意味著當有閑置的可用對象在對象池中時,borrowObject方法會返回最近的實例。如果配置文件中的lifo配置項的值為false,則將返回相反排序的實例,也就是會返回最先進入對象池的對象的實例。

    b)StackObjectPool:使用LIFO行為實現(xiàn)的ObjectPool。

    c)SoftReferenceObjectPool:使用LIFO行為實現(xiàn)的ObjectPool。此外,在這個對象池實現(xiàn)中,每個對象都會被包裝到一個SoftReference中。SoftReference允許垃圾回收機制在需要釋放內(nèi)存時回收對象池中的對象。

    (2)KeyedObjectPool

    KeyedObjectPool對象池有多種類型情況的對象池的實現(xiàn),每種類型對應(yīng)一個任意的鍵值,組件給出了GenericKeyedObjectPool、StackKeyedObjectPool兩個基本的實現(xiàn)類;

    a)GenericKeyedObjectPool:通過FIFO行為實現(xiàn)的對象池。

    b)StackKeyedObjectPool:通過LIFO行為實現(xiàn)的對象池。

五、PoolableObjectFactory、ObjectPool及ObjectPoolFactory

 commons pool組件中,對象池化的工作被劃分給了三類對象: PoolableObjectFactoryExample.java

(1)       PoolableObjectFactory用于管理池化對象的產(chǎn)生、激活、掛起、校驗和銷毀;

 

(2)       ObjectPool用于管理要被池化的對象的借出和歸還,同時通知PoolableObjectFactory完成相應(yīng)的工作;

(3)       ObjectPoolFactory則用于大量生成相同類型和設(shè)置的ObjectPool;

     相應(yīng)的,使用Pool組件的過程,也可大體劃分成“實現(xiàn)自己的PoolableObjectFactory”、“使用

  ObjectPool”和可選的“利用ObjectPoolFactory”三個步驟。

(1) 實現(xiàn)自己的PoolableObjectFactory

     ObjectPool的實例在需要處理池化的對象的產(chǎn)生、激活、掛起、校驗和銷毀工作時,就會調(diào)用跟它

 關(guān)聯(lián)在一起的PoolableObjectFactory實例的相應(yīng)方法來操作。PoolableObjectFactory是commons-pool

 中定義個一個接口,Pool組件中沒有包含任何一種PoolableObjectFactory實現(xiàn),需要根據(jù)情況自行創(chuàng)立。

 

Java代碼 復(fù)制代碼 收藏代碼
  1. // 該方法用于產(chǎn)生你要放入到對象池中的新對象   
  2. Object makeObject() throws Exception;   
  3.   
  4. // 該方法用于銷毀對象   
  5. void destroyObject(Object obj) throws Exception;   
  6.   
  7.   
  8. boolean validateObject(Object obj);   
  9.   
  10.   
  11. void activateObject(Object obj) throws Exception;   
  12.   
  13. // 該方法用于將對象“掛起”,將對象設(shè)置為休眠狀態(tài)即不可用   
  14. void passivateObject(Object obj) throws Exception;  

 

 

 

ObjectPool是Pool組件中定義的一個接口,實際使用的時候同樣需要利用這個接口的具

體實現(xiàn)。Pool組件本身提供了幾種實現(xiàn),可以直接使用。當然也可以自行創(chuàng)建。

ObjectPool的使用方法:

(a)、  生成一個要用的PoolableObjectFactory類的實例

PoolableObjectPoolFactory factory = new PoolableObjectPoolFactoryExample();

(b)、  利用PoolableObjectPoolFactory實例為參數(shù),生成一個實現(xiàn)了ObjectPool接口的類的實

例,作為對象池ObjectPool pool = new StackObjectPool(factory);

(c)、  需要從對象池中獲取對象時,調(diào)用對應(yīng)的borrowObject()方法Object obj = pool.borrowObject();

(d)、  將對象放回對象池中,調(diào)用returnObject(Object obj)方法pool.returnObject(obj);

(e)、  當不再需要對象池時,直接調(diào)用對象池上的close()方法,釋放資源。pool.close();

另外,ObjectPool接口還定義了幾個可以由具體的實現(xiàn)決定要不要支持的操作,包括:

void clear()

清除所有當前在此對象池中休眠的對象。

int getNumActive()

返回已經(jīng)從此對象池中借出的對象的總數(shù)。

int getNumIdle()

返回當前在此對象池中休眠的對象的數(shù)目。

void setFactory(PoolableObjectFactory factory)

將當前對象池與參數(shù)中給定的PoolableObjectFactory相關(guān)聯(lián)。如果在當前狀態(tài)下,無法

完成這一操作,會有一個IllegalStateException異常拋出。

(3)使用ObjectPoolFactory

ObjectPoolFactory是Pool組件中定義的一個接口,它定義了一個createPool()方法,可以

用于大量產(chǎn)生類型和設(shè)置都相同的ObjectPool的對象。

Pool組件中,對每一個ObjectPool的實現(xiàn),都有一個對應(yīng)的ObjectPoolFactory實現(xiàn)。

最后給出一個較為完整的例子:

 

Java代碼 復(fù)制代碼 收藏代碼
  1. package org.apache.commons.pool;   
  2.   
  3. public class PoolableObjectFactoryExample implements PoolableObjectFactory   
  4. {   
  5.       
  6.     private static int count 0;   
  7.   
  8.       
  9.     @Override  
  10.     public void activateObject(Object obj) throws Exception   
  11.     {   
  12.         System.out.println("destroyObject run obj);   
  13.     }   
  14.   
  15.       
  16.     @Override  
  17.     public void destroyObject(Object obj) throws Exception   
  18.     {   
  19.         System.out.println("destroyObject run obj);   
  20.     }   
  21.   
  22.       
  23.     @Override  
  24.     public Object makeObject() throws Exception   
  25.     {   
  26.         String obj String.valueOf(count);   
  27.         System.out.println("makeObject run obj);   
  28.         return obj;   
  29.     }   
  30.   
  31.       
  32.     @Override  
  33.     public void passivateObject(Object obj) throws Exception   
  34.     {   
  35.         System.out.println("passivateObject run obj);   
  36.     }   
  37.   
  38.       
  39.     @Override  
  40.     public boolean validateObject(Object obj)   
  41.     {   
  42.         boolean flag false;   
  43.         if(obj.equals(obj))   
  44.         {   
  45.             flag true;   
  46.         }   
  47.         return flag;   
  48.     }   
  49.   
  50.  

 

ObjectPoolExample.java
Java代碼 復(fù)制代碼 收藏代碼
  1. package org.apache.commons.pool;   
  2.   
  3. import org.apache.commons.pool.impl.StackObjectPoolFactory;   
  4.   
  5. public class ObjectPoolExample   
  6. {   
  7.     public static void main(String[] args)   
  8.     {   
  9.         // 生成PoolableObjectFactory實例   
  10.         PoolableObjectFactory _factory new PoolableObjectFactoryExample();   
  11.         // 生成一個ObjectPoolFactory實例   
  12.         ObjectPoolFactory objFactory new StackObjectPoolFactory(_factory);   
  13.         // 生成一個ObjectPool實例   
  14.         ObjectPool pool objFactory.createPool();   
  15.         // 獲取對象池中的一個可用對象   
  16.         try  
  17.         {   
  18.             Object obj pool.borrowObject();   
  19.             // 使用對象   
  20.             pool.returnObject(obj);   
  21.             obj null;   
  22.         }   
  23.         catch(Exception ex)   
  24.         {   
  25.             ex.printStackTrace();   
  26.         }   
  27.         finally  
  28.         {   
  29.             try  
  30.             {   
  31.                 // 關(guān)閉對象池   
  32.                 pool.close();   
  33.                 pool null;   
  34.             }   
  35.             catch(Exception ex)   
  36.             {   
  37.                 ex.printStackTrace();   
  38.             }   
  39.         }   
  40.     }   
  41.  

 

 

來自http://blog.sina.com.cn/s/blog_9076f9ba01016fap.html

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多