程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 舉例講授Java設計形式中的對象池形式編程

舉例講授Java設計形式中的對象池形式編程

編輯:關於JAVA

舉例講授Java設計形式中的對象池形式編程。本站提示廣大學習愛好者:(舉例講授Java設計形式中的對象池形式編程)文章只能為提供參考,不一定能成為您想要的結果。以下是舉例講授Java設計形式中的對象池形式編程正文


界說
一個對象池是一組曾經初始化過且可使用的對象的聚集,池的用戶可以從池子中獲得對象,對其停止操作處置,並在不須要時清償給池子而非燒毀它。

若初始化、實例化的價值高,且有需求須要常常實例化,但每次實例化的數目較少的情形下,應用對象池可以取得明顯的效能晉升。從池子中獲得對象的時光是可猜測的,但新建一個實例所需的時光是不肯定。

完成

1. Reusable - 對象池中的對象,平日實例化價值比擬高。
2. Client - 應用一個對象的實例。
3. ReusablePool - 治理對象的實例化,收受接管和燒毀。

單個實例中重要的思惟
1.一個棧,這裡用stack
2.初始化辦法,容器開啟的時刻可以事後創立池
3.創立實例的辦法
4.供給從池中取得對象實例的辦法
5.供給前往的辦法,不前往效果很嚴重
6.掌握要求期待時光的辦法,過了必定的事宜還沒取得對象實例,就前往一個null指針

import java.util.Stack; 
 
@SuppressWarnings("unchecked") 
public class ObjectPool { 
 
  public ObjectPool() { 
  } 
 
  private PoolParam poolParam; 
 
  public void setPoolParam(PoolParam poolParam) { 
    this.poolParam = poolParam; 
  } 
 
  // 以後總對象個數 
  private int currentNum = 0; 
 
  private Class clazz; 
 
  public void setClazz(Class clazz) { 
    this.clazz = clazz; 
  } 
 
  // 棧,用來寄存對象,模仿一個池 
  private Stack stack; 
 
  public Stack getStack() { 
    return stack; 
  } 
 
  public void setStack(Stack stack) { 
    this.stack = stack; 
  } 
 
  // ................................................................. 
  // 期待超時的記數變量 
  private int timeWait = 0; 
 
  // ................................................................. 
 
  // 創立對象池 
  public void initalPool(PoolParam poolParam, Class clazz) { 
 
    this.setPoolParam(poolParam); 
    this.setClazz(clazz); 
 
    stack = new Stack(); 
 
    stack.clear(); 
 
    // System.out.println("obj..pool is initial..."); 
    // 生成設置裝備擺設最小對象數,並壓入棧中 
    try { 
 
      for (int i = 0; i < poolParam.getMinObjectCount(); i++) { 
 
        // 依據poolParam初始化對象池 
        stack.push(clazz.newInstance()); 
      } 
 
    } catch (InstantiationException e) { 
      e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
    } 
 
  } 
 
  // 創立單個對象 
  private Object createObj(Class clazz) { 
 
    Object obj = null; 
    try { 
 
      obj = clazz.newInstance(); 
 
      // System.out.println("a new one..."); 
    } catch (InstantiationException e) { 
      e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
    } 
 
    return obj; 
  } 
 
  // 對象池供給的get辦法 
  public Object getInstance(){ 
 
    // System.out.println(stack.size()); 
 
    Object object = null; 
 
    if (stack.size() == 0) { 
 
      // 假如以後棧的長度為0,而且總的對象數沒有跨越界說最年夜數 
      if ((currentNum + poolParam.getMinObjectCount()) < poolParam 
          .getMaxObjectCount()) { 
 
        // 新創立一個對象 
        object = this.createObj(clazz); 
        // 對象數+1 
        currentNum++; 
 
      } else { 
 
        synchronized (this) { 
 
          try { 
            waitme(this); 
          } catch (Exception e) { 
            e.printStackTrace(); 
          } 
 
          // 取得告訴後檢測棧中是為空,並給出方才釋放的資本 
          if (!stack.empty()) { 
            object = stack.pop(); 
          } 
        } 
      } 
 
    } else if (stack.size() > 0) { 
 
      object = stack.pop(); 
 
      // System.out.println(stack.size()); 
    } 
 
    return object; 
  } 
 
  // 前往對象的辦法 
  public void returnObj(Object obj) { 
 
    if (clazz.isInstance(obj)) { 
 
      stack.push(obj); 
 
      synchronized (this) { 
 
        notify(); 
      } 
    } else { 
      System.out.println("this object can not push to stack!"); 
    } 
 
  } 
 
  // 期待遞歸算法 
  private void waitme(ObjectPool pool) { 
 
    // 期待2s的技巧掌握 
    if (timeWait >= 2000) { 
      System.out.println("jump up this step.."); 
 
      timeWait = 0; 
      return; 
 
    } else { 
 
      try { 
 
        pool.wait(500); 
 
        // 期待計數累加。。 
        timeWait +=1000; 
 
        System.out.println("waiting time to free obj.."); 
 
        if (stack.empty()) { 
          System.out.println("agian...."); 
          waitme(pool); 
        } 
 
      } catch (InterruptedException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
 
} 

 
治理池類,這個不是很難,同步了就好

@SuppressWarnings("unchecked") 
public class ObjectPoolManage { 
 
  private ObjectPoolManage() { 
  } 
 
  private static ObjectPool pool; 
   
 
 
  // 完成一個單例的獲得辦法....默許 
  public static synchronized ObjectPool getCacheObject(Class clazz) { 
 
    if (null != pool) { 
      return pool; 
    } else { 
 
      createObjectPool(null, clazz); 
      return pool; 
    } 
 
  } 
 
  // 完成一個單例的獲得辦法...自界說 
 
  public static synchronized ObjectPool getCacheObject(PoolParam p, Class clazz) { 
    if (null != pool) { 
      return pool; 
    } else { 
 
      createObjectPool(p, clazz); 
      return pool; 
    } 
 
  } 
 
  private static ObjectPool createObjectPool(PoolParam p, Class clazz) { 
 
    pool = new ObjectPool(); 
 
    if (null == p) { 
      pool.initalPool(new PoolParam(5,10), clazz); 
    } else { 
      pool.initalPool(p, clazz); 
    } 
 
    return pool; 
  } 
   
  private static Class getclazz(){ 
     
    Class clazz=null; 
     
    try { 
      clazz= Class.forName(ppp.getPropertyByName("objectPath")); 
    } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
    } 
     
    return clazz; 
  } 
} 


相干成績和完成
1. 對象池中可以限制對象的個數,當跨越限制時,對象池須要前往異常或許空值,以告訴客戶。
2. 在多線程情況中,在checkout和checkin辦法須要同步。
3. 准時清算過時的對象。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved