<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 325,  comments - 25,  trackbacks - 0
     

    1.對(duì)象池化技術(shù)的基本思路

    將用過(guò)的對(duì)象保存起來(lái),等下一次需要這種對(duì)象的時(shí)候,再拿出來(lái)重復(fù)使用,從而在一定程度上減少頻繁創(chuàng)建對(duì)象所造成的開銷。用于充當(dāng)保存對(duì)象的“容器”的對(duì)象,被稱為“對(duì)象池”(Object Pool,或簡(jiǎn)稱Pool)。

    2. Jakarta Commons Pool組件及其使用

    Jakarta Commons Pool是一個(gè)用于在Java程序中實(shí)現(xiàn)對(duì)象池化的組件,它包含兩個(gè)包(org.apache.commons.pool和org.apache.commons.pool.impl)。下載commons-dbcp,將commons-pool.jar和commons-collections.jar及commons-dbcp-1.2.2.jar放到所在工程的classpath中。

    3. 對(duì)象池化的工作中用到的三類對(duì)象

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

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

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

    3.1 創(chuàng)立PoolableObjectFactory

         PoolableObjectFactory是在org.apache.commons.pool包中定義的一個(gè)接口。實(shí)際使用的時(shí)候需要利用這個(gè)接口的一個(gè)具體實(shí)現(xiàn)。如下:

    創(chuàng)建一個(gè)實(shí)現(xiàn)類PoolableObjectFactorySample.java
    import org.apache.commons.pool.PoolableObjectFactory;
    public class PoolableObjectFactorySample
            implements PoolableObjectFactory {
    private static int counter = 0;
    /* *
    *這個(gè)方法用于在必要時(shí)產(chǎn)生新的對(duì)象。
         */
        public Object makeObject() throws Exception {
            Object obj = String.valueOf(counter++);
            System.err.println("Making Object " + obj);
            return obj;
    }
    /* *
    * 這個(gè)方法用于將對(duì)象“激活”設(shè)置為適合開始使用的狀態(tài)。
    */
        public void activateObject(Object obj) throws Exception {
            System.err.println("Activating Object " + obj);
    }
    /* *
    *這個(gè)方法用于將對(duì)象“掛起”設(shè)置為適合開始休眠的狀態(tài)。
    */
        public void passivateObject(Object obj) throws Exception {
            System.err.println("Passivating Object " + obj);
    }
    /* *
    *這個(gè)方法用于校驗(yàn)一個(gè)具體的對(duì)象是否仍然有效,已失效的對(duì)象會(huì)被自動(dòng)交
    *給destroyObject方法銷毀
    */
        public boolean validateObject(Object obj) {
            /* 以1/2的將對(duì)象判定失效 */
            boolean result = (Math.random() > 0.5);
            System.err.println("Validating Object "
                    + obj + " : " + result);
            return result;
    }
    /* *
    *這個(gè)方法用于銷毀被validateObject判定為已失效的對(duì)象。
    */
        public void destroyObject(Object obj) throws Exception {
            System.err.println("Destroying Object " + obj);
        }
    }

    3.2 使用ObjectPool

        ObjectPool是在org.apache.commons.pool包中定義的一個(gè)接口,實(shí)際使用的時(shí)候也需要利用這個(gè)接口的一個(gè)具體實(shí)現(xiàn)。如下:

        創(chuàng)建一個(gè)ObjectPoolSample.java類:

    import org.apache.commons.pool.ObjectPool;
    import org.apache.commons.pool.PoolableObjectFactory;
    import org.apache.commons.pool.impl.StackObjectPool;
    public class ObjectPoolSample {
        public static void main(String[] args) {
            Object obj = null;
     /*生成PoolableObjectFactory類的實(shí)例*/
            PoolableObjectFactory factory = new PoolableObjectFactorySample();
    /*生成一個(gè)實(shí)現(xiàn)了ObjectPool接口的類(例如StackObjectPool)的實(shí)例*/
            ObjectPool pool = new StackObjectPool(factory);
            try {
                for(long i = 0; i < 100 ; i++) {
                    System.out.println("== " + i + " ==");
                    obj = pool.borrowObject(); //從對(duì)象池中取出對(duì)象
                    System.out.println(obj);
                    pool.returnObject(obj); //將對(duì)象放回對(duì)象池
                }
                obj = null;//明確地設(shè)為null,作為對(duì)象已歸還標(biāo)
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            finally {
                try{
                    if (obj != null) {//避免個(gè)對(duì)歸還兩
                        pool.returnObject(obj);
                    }
                    pool.close();
                }
                catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }

    3.3 利用ObjectPoolFactory

        要在多處生成類型和設(shè)置都相同的ObjectPool就要使用ObjectPoolFactory。ObjectPoolFactory是一個(gè)在org.apache.commons.pool中定義的接口,它定義了一個(gè)ObjectPool createPool()方法,可以用于大量生產(chǎn)類型和設(shè)置都相同的ObjectPool。實(shí)例如下:

     創(chuàng)建一個(gè)ObjectPoolFactorySample.java文件。
    import org.apache.commons.pool.ObjectPool;
    import org.apache.commons.pool.ObjectPoolFactory;
    import org.apache.commons.pool.PoolableObjectFactory;
    import org.apache.commons.pool.impl.StackObjectPoolFactory;
    public class ObjectPoolFactorySample {
        public static void main(String[] args) {
            Object obj = null;
            PoolableObjectFactory factory
                    = new PoolableObjectFactorySample();
            ObjectPoolFactory poolFactory
                    = new StackObjectPoolFactory(factory);
            ObjectPool pool = poolFactory.createPool();
            try {
                for(long i = 0; i < 100 ; i++) {
                    System.out.println("== " + i + " ==");
                    obj = pool.borrowObject();
                    System.out.println(obj);
                    pool.returnObject(obj);
                }
                obj = null;
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            finally {
                try{
                    if (obj != null) {
                        pool.returnObject(obj);
                    }
                    pool.close();
                }
                catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }

    4.借助BasePoolableObjectFactory

       BasePoolableObjectFactory是org.apache.commons.pool包中的一個(gè)抽象類。它實(shí)現(xiàn)了PoolableObjectFactory接口,并且為makeObject方法提供了一個(gè)基本的實(shí)現(xiàn),而activateObject、passivateObject和destroyObject方法不進(jìn)行任何操作, validateObject始終返回true。通過(guò)繼承這個(gè)類,而不是直接實(shí)現(xiàn)PoolableObjectFactory接口,就可以免去編寫一些只起到讓編譯通過(guò)的作用的代碼的麻煩了。實(shí)例如下:

    創(chuàng)建一個(gè)BasePoolableObjectFactorySample.java 文件。
    import org.apache.commons.pool.BasePoolableObjectFactory;
    public class BasePoolableObjectFactorySample 
            extends BasePoolableObjectFactory {
        private int counter = 0;
        public Object makeObject() throws Exception {
            return String.valueOf(counter++);
        }
    }
    5. ObjectPool的分類
    l         StackObjectPool   利用java.util.Stack對(duì)象來(lái)保存對(duì)象池里的對(duì)象。
    l        SoftReferenceObjectPool 利用java.util.ArrayList對(duì)象來(lái)保存對(duì)象池里的對(duì)象。
    l         GenericObjectPool利用一個(gè)org.apache.commons.collections.CursorableLinkedList對(duì)象來(lái)保存對(duì)象池里的對(duì)象。
    posted on 2008-06-01 14:08 長(zhǎng)春語(yǔ)林科技 閱讀(399) 評(píng)論(0)  編輯  收藏 所屬分類: util
    <2008年6月>
    25262728293031
    1234567
    891011121314
    15161718192021
    22232425262728
    293012345

     

    長(zhǎng)春語(yǔ)林科技?xì)g迎您!

    常用鏈接

    留言簿(6)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊(cè)

    收藏夾

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲伊人色一综合网| 国产国拍亚洲精品mv在线观看| 亚洲成人网在线观看| 毛片无码免费无码播放| 亚洲第一精品在线视频| 一区二区在线免费观看| 亚洲国产精品久久久久| 国产免费女女脚奴视频网| 亚洲一级毛片免费观看| 国内大片在线免费看| 蜜芽亚洲av无码一区二区三区| 亚洲成人国产精品| 你是我的城池营垒免费看 | 亚州**色毛片免费观看| 亚洲成a人一区二区三区| 在线免费播放一级毛片| 久久久久亚洲AV成人无码| 99无码人妻一区二区三区免费| 精品久久久久久亚洲精品| 国产美女a做受大片免费| 一级黄色免费大片| 久久精品国产亚洲AV麻豆王友容| 57pao国产成视频免费播放| 亚洲综合无码一区二区痴汉| 日本免费人成视频播放| 久久精品免费大片国产大片| 亚洲综合亚洲国产尤物| 免费看无码自慰一区二区| 国产免费牲交视频免费播放 | 日韩精品亚洲aⅴ在线影院| 亚洲午夜免费视频| 亚洲熟妇久久精品| 亚洲精品国产精品乱码视色| 国产成人免费高清激情明星| 国产AV无码专区亚洲AV蜜芽 | 国产AV无码专区亚洲AVJULIA| 日本XXX黄区免费看| 一级特级女人18毛片免费视频| 久久久亚洲欧洲日产国码二区 | 国产做国产爱免费视频| 亚洲一区二区三区在线网站|