<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)論排行榜

    主站蜘蛛池模板: 亚洲综合激情另类小说区| 国产午夜鲁丝片AV无码免费| 久久aⅴ免费观看| 在线观看免费无码视频| 久久国产精品免费| 亚欧乱色国产精品免费视频| 免费观看亚洲人成网站| 国产综合成人亚洲区| 日韩亚洲翔田千里在线| 免费亚洲视频在线观看| yellow免费网站| 福利免费在线观看| 久久久精品午夜免费不卡| 久久久久国产精品免费免费不卡| 亚洲精品免费观看| 99在线精品视频观看免费| 中国在线观看免费国语版| 精品剧情v国产在免费线观看| 在线观看亚洲免费| 免费a级毛片18以上观看精品| 免费在线观看黄网站| 国产亚洲人成A在线V网站| 亚洲av无码片在线播放| 亚洲最大视频网站| 亚洲色少妇熟女11p| 免费的黄色的网站| 日韩视频在线观看免费| 18国产精品白浆在线观看免费 | 亚洲人成网站999久久久综合| 亚洲av日韩综合一区二区三区| 免费一级毛片在线播放视频免费观看永久 | 成人免费一区二区无码视频| 日韩免费毛片视频| 久久久久久A亚洲欧洲AV冫| 亚洲第一极品精品无码久久| 亚洲制服在线观看| 妇女自拍偷自拍亚洲精品| 国产一级婬片A视频免费观看| **实干一级毛片aa免费| 手机看片久久国产免费| 亚洲日本乱码在线观看|