国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

java設(shè)計(jì)模式之實(shí)現(xiàn)對(duì)象池模式示例分享

2019-11-26 15:41:34
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

ObjectPool抽象父類(lèi)

復(fù)制代碼 代碼如下:

import java.util.Iterator;
import java.util.Vector;

public abstract class ObjectPool<T> {

   private Vector<T> locked, unlocked;   // locked是已占用的對(duì)象集合,unlocked是可用對(duì)象集合

   public ObjectPool() {
    locked = new Vector<T>();
    unlocked = new Vector<T>();
   }

   // 創(chuàng)建對(duì)象
   protected abstract T create();

   // 驗(yàn)證對(duì)象有效性
   public abstract boolean validate(T o);

   // 使對(duì)象失效
   public abstract void expire(T o);

   // 檢出:從對(duì)象池獲取對(duì)象
   public synchronized T checkOut() {
    T t;
    if (unlocked.size() > 0) {
     Iterator<T> iter = unlocked.iterator();
     while(iter.hasNext()) {
      t = iter.next();
      if(validate(t)) {   // 對(duì)象有效
       unlocked.remove(t);
       locked.add(t);

       return t;
      }
      else {   // 對(duì)象已經(jīng)失效
       unlocked.remove(t);
       expire(t);
      }
     }
    }

    // 對(duì)象池塘沒(méi)有可用對(duì)象,創(chuàng)建新對(duì)象
    t = create();
    locked.add(t);

    return (t);
   }

   // 檢入:釋放對(duì)象回對(duì)象池
   public synchronized void checkIn(T t) {
    locked.remove(t);
    if(validate(t)) {   // 如果對(duì)象仍有效則放回可用對(duì)象集合中
     unlocked.add(t);
    }
    else {   // 否則使對(duì)象失效
     expire(t);
    }
   }

}

JDBCConnectionPool子類(lèi)

復(fù)制代碼 代碼如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCConnectionPool extends ObjectPool<Connection> {

 private String url, usr, pwd;

 public JDBCConnectionPool(String driver, String url, String usr, String pwd) {
  super();

  // 加載對(duì)應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)
  try {
   Class.forName(driver).newInstance();
  }
  catch(Exception e) {
   e.printStackTrace();
  }

  this.url = url;
  this.usr = usr;
  this.pwd = pwd;
 }

 @Override
 protected Connection create() {
  try {
   return DriverManager.getConnection(url, usr, pwd);
  }
  catch(SQLException e) {
   e.printStackTrace();
  }

  return null;
 }

 @Override
 public boolean validate(Connection o) {
  try {
   return o.isClosed();
  }
  catch(SQLException e) {
   e.printStackTrace();
  }

  return false;
 }

 @Override
 public void expire(Connection o) {
  try {
   o.close();
  }
  catch(SQLException e) {
   e.printStackTrace();
  }
  finally {
   o = null;
  }
 }

 public static void main(String[] args) {
  JDBCConnectionPool dbConnPool = new JDBCConnectionPool("com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/test", "root", "123");

  // 獲取數(shù)據(jù)庫(kù)連接對(duì)象
  Connection conn = dbConnPool.checkOut();

  // 使用數(shù)據(jù)庫(kù)連接對(duì)象
  // ...

  // 釋放數(shù)據(jù)庫(kù)連接對(duì)象
  dbConnPool.checkIn(conn);

 }

}

復(fù)制代碼 代碼如下:

class Pool {
   private static final MAX_AVAILABLE = 100;
   private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);

   public Object getItem() throws InterruptedException {
     available.acquire();
     return getNextAvailableItem();
   }

   public void putItem(Object x) {
     if (markAsUnused(x))
       available.release();
   }

   // Not a particularly efficient data structure; just for demo

   protected Object[] items = ... whatever kinds of items being managed
   protected boolean[] used = new boolean[MAX_AVAILABLE];

   protected synchronized Object getNextAvailableItem() {
     for (int i = 0; i < MAX_AVAILABLE; ++i) {
       if (!used[i]) {
          used[i] = true;
          return items[i];
       }
     }
     return null; // not reached
   }

   protected synchronized boolean markAsUnused(Object item) {
     for (int i = 0; i < MAX_AVAILABLE; ++i) {
       if (item == items[i]) {
          if (used[i]) {
            used[i] = false;
            return true;
          } else
            return false;
       }
     }
     return false;
   }

 }

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 平安县| 鹤岗市| 万年县| 阿荣旗| 金平| 开封市| 霍林郭勒市| 稻城县| 南昌市| 石阡县| 塔城市| 平泉县| 古交市| 阿城市| 崇礼县| 五台县| 祁东县| 固镇县| 巴林右旗| 沽源县| 凤凰县| 桐庐县| 稷山县| 武夷山市| 阿拉善右旗| 昌吉市| 孝感市| 保山市| 晋中市| 乌海市| 应用必备| 永和县| 富蕴县| 西贡区| 普兰店市| 祁门县| 徐汇区| 花莲市| 丹巴县| 化德县| 嘉祥县|