java 对象池 管理 自创

对象池的概念俺在这里就不罗嗦了,呵呵。主要是省去相同对象的频繁创建开销和回收器回收开销。

 

无依赖关系,JDK 1.5 以上的版本可以直接使用,呵呵

 

 

Java代码 复制代码  收藏代码
  1. /**  
  2.  * @ObjectPool.java  
  3.  * @author 张光磊  
  4.  * @since  2010-3-31 下午01:41:35  
  5.  */  
  6. package cn.zgl.utils.pool;   
  7.   
  8. import java.util.ArrayList;   
  9. import java.util.concurrent.Semaphore;   
  10.   
  11. /**  
  12.  * @author 张光磊  
  13.  * @version 2010.03 对象池管理类  
  14.  */  
  15. public abstract  class ObjectPool<T> {   
  16.      private ArrayList<T> pool = null;   
  17.      private int size=0;   
  18.      private int step=0;   
  19.      private int currentPoolSize=0;   
  20.      private Semaphore pass = null;   
  21.      /**  
  22.       * 初始化ObjectPool maxSize 个  
  23.       * @param maxSize  
  24.       */  
  25.      public ObjectPool(int maxSize){   
  26.     
  27.            //初始化资源池   
  28.            this.size =maxSize;   
  29.            pool = new ArrayList<T>();   
  30.            for(int i=0; i<maxSize; i++){   
  31.                 pool.add(createT());   
  32.            }   
  33.            currentPoolSize=maxSize;   
  34.            pass = new Semaphore(size);   
  35.   
  36.      }   
  37.      /**  
  38.       * 最多初始化ObjectPool maxSize 个,默认初始化initsize 个,之后以 step递增  
  39.       * @param maxSize 最大个数  
  40.       * @param initsize 初始化个数     
  41.       * @param step 递增个数  
  42.       */  
  43.      public ObjectPool(int maxSize,int initsize,int step){   
  44.   
  45.          //初始化资源池   
  46.          this.size =maxSize;   
  47.          this.step=step;   
  48.          pool = new ArrayList<T>();   
  49.          for(int i=0; i<maxSize; i++){   
  50.              pool.add(createT());   
  51.          }   
  52.          currentPoolSize=maxSize;   
  53.          pass = new Semaphore(size);   
  54.   
  55.      }   
  56.      /**  
  57.       * 从池中读取一个  
  58.       * @author 张光磊  
  59.       * @since  2010-3-31 下午04:21:19  
  60.       * @return T  
  61.       * @return  
  62.       * @throws InterruptedException  
  63.       */  
  64.      public T get() throws InterruptedException{   
  65.   
  66.            //获取通行证,只有得到通行证后才能得到资源   
  67.            pass.acquire();   
  68.            return getSourceFromPool();   
  69.   
  70.      }   
  71.      /**  
  72.       * 归还一个到池中  
  73.       * @author 张光磊  
  74.       * @since  2010-3-31 下午04:21:30  
  75.       * @return void  
  76.       * @param resource  
  77.       */  
  78.      public void put(T resource){   
  79.   
  80.            //归还通行证,并归还资源   
  81.            pass.release();   
  82.            releaseSourceToPool(resource);   
  83.   
  84.      }   
  85.      /**  
  86.       * 将池中的全部释放  
  87.       * @author 张光磊  
  88.       * @since  2010-3-31 下午04:21:41  
  89.       * @return void  
  90.       */  
  91.     //public void relasePool(){   
  92.     //   for(T t:pool){   
  93.     //       destroyT(t);   
  94.     //   }   
  95.     //}   
  96.     //更正为      
  97.      public void relasePool(){   
  98.          for(int i=0;i<size;i++){   
  99.                        pass.acquire();   
  100.               destroyT(getSourceFromPool());   
  101.          }   
  102.      }   
  103.   /**  
  104.      * 读取一个 私有  
  105.      * @author 张光磊  
  106.      * @since  2010-3-31 下午04:22:17  
  107.      * @return T  
  108.      * @return  
  109.      */  
  110.     private synchronized T getSourceFromPool() {   
  111.         if(pool.size()==0){   
  112.            if(currentPoolSize<size){   
  113.               int newT= size-currentPoolSize>step ? step: size-currentPoolSize;    
  114.               for(int i=0; i<newT; i++){   
  115.                   pool.add(createT());   
  116.              }   
  117.              currentPoolSize+=newT;   
  118.            }   
  119.         }   
  120.         return pool.remove(0);   
  121.      }   
  122.      /**  
  123.       * 释放一个 到 池中 私有  
  124.       * @author 张光磊  
  125.       * @since  2010-3-31 下午04:22:34  
  126.       * @return void  
  127.       * @param resource  
  128.       */  
  129.      private synchronized void releaseSourceToPool(T resource) {   
  130.           // System.out.println("return "+resource);   
  131.           pool.add(resource);   
  132.      }    
  133.         
  134.      //创建、销毁对象   
  135.    abstract T createT();   
  136.      abstract void destroyT(T t);   
  137.      // 示例:public class IntegerPool extends ObjectPool<Integer>   
  138. }  

下面是一个简单的示例,呵呵

 

Java代码 复制代码  收藏代码
  1. /**  
  2.  * @IntegerPoolExample.java  
  3.  * @author 张光磊  
  4.  * @since  2010-3-31 下午03:18:05  
  5.  */  
  6. package cn.zgl.utils.pool;   
  7.   
  8. /**  
  9.  * @author 张光磊  
  10.  */  
  11. public class IntegerPoolExample extends ObjectPool<Integer>{   
  12.   
  13.     /**  
  14.      * @param maxSize  
  15.      */  
  16.     public IntegerPoolExample(int maxSize) {   
  17.         super(maxSize);   
  18.         // TODO Auto-generated constructor stub   
  19.     }   
  20.        
  21.     public IntegerPoolExample() {   
  22.         super(10);   
  23.     }   
  24.     /* (non-Javadoc)  
  25.      * @see cn.zgl.utils.pool.ObjectPool#createT()  
  26.      */  
  27.     @Override  
  28.     Integer createT() {   
  29.         return 0;   
  30.     }   
  31.   
  32.     /* (non-Javadoc)  
  33.      * @see cn.zgl.utils.pool.ObjectPool#destroyT(java.lang.Object)  
  34.      */  
  35.     @Override  
  36.     void destroyT(Integer t) {   
  37.         t=null;   
  38.     }   
  39. }  

 

 

当然 Integer 一般是不需要用池来管理的,这仅仅是一个示例,呵呵。

 

  使用示例

 

Java代码 复制代码  收藏代码
  1. public static void main(String[] args){   
  2.         ObjectPool<Integer> pool= new IntegerPoolExample();   
  3.         try{   
  4.             for(int i=0;i<10;i++){   
  5.                 //从池中取出一个   
  6.                 Integer tmp=pool.get();   
  7.                 System.out.println("第"+i+"次输出内容 " +tmp);   
  8.                 //修改取出的这个值   
  9.                 tmp=i;   
  10.                 //把修改后的值访问去 这个地方只是测试测试,实际上池中对象一般要求使用前、使用后没有变化   
  11.                 pool.put(tmp);   
  12.             }   
  13.             for(int i=0;i<10;i++){   
  14.                 System.out.println("第"+i+"次输出内容 " +pool.get());   
  15.             }   
  16.         }catch(InterruptedException e){   
  17.             e.printStackTrace();   
  18.         }   
  19.         finally{   
  20.             pool.relasePool();   
  21.         }   
  22.   
  23.     }  

 

 

 

那么,到此为止了。呵呵,大家多多指点,个人资料请勿随意转载

 

原链接地址http://xian0617.iteye.com/blog/629333

你可能感兴趣的:(java 对象池 管理 自创)