abstractobjectpool.java

来自「基于corba的资源池,实现了实例池供客户端调用,并且实例池对实例的分配采用策略」· Java 代码 · 共 91 行

JAVA
91
字号
//实例池的父类
package pool;

import java.util.*;

public abstract class AbstractObjectPool implements Pool
{
	//资源池的上下阀值
	protected int minPoolSize = 100;
	protected int maxPoolSize =500;
	//命中和未命中次数
	private static int bingocnt = 0;
	private static int unBingocnt = 0;
	//资源容器
	private ArrayList freePooledObjects = new ArrayList();
	protected ArrayList usedPooledObjects = new ArrayList();
	private ArrayList inUsedObjects = new ArrayList();
	//资源池对象工厂
	protected PoolObjectFactory pof = null;
	//策略对象集
	private SelectorStrategy s;
	
   public AbstractObjectPool(SelectorStrategy s)
   {
		pof = new PoolObjectFactory();
		for (int i = 0; i < minPoolSize; i++)
		{
			freePooledObjects.add(pof.newInstance());
		}
		this.s = s;
   }

   /**
	 * 获取资源
	 */
	public synchronized Object checkOut(String id)
	{
		Object o; 
		if( usedPooledObjects.size() > 0)
		{
			Iterator it = usedPooledObjects.iterator();
			while( it.hasNext() )
			{
				o = it.next();
				if( validate( o,id ) )
				{
					usedPooledObjects.remove( o );
					inUsedObjects.add( o );  
					bingocnt++;
					return( o );
				}
			}
		}
		
		if(freePooledObjects.size() > 0) 
		{
			o = ((SelectorStrategy)s).select(freePooledObjects);
			freePooledObjects.remove(o);
			inUsedObjects.add( o );
			unBingocnt++;
			return o;
		}
		
		if((usedPooledObjects.size()+inUsedObjects.size())<maxPoolSize)
		{
			o = create(); 
			inUsedObjects.add( o ); 
			unBingocnt++;
			return( o );
		}
		return null;
	}

	/**
	 * 释放资源
	 */
	public synchronized void  checkIn(Object o) {
		// TODO Auto-generated method stub
		//System.out.println(o.getClass());
		inUsedObjects.remove( o );
		usedPooledObjects.add( o );
	}
	
	public abstract Object create();
	public abstract boolean validate( Object o ,String id);
	public  void expire()
	{
		usedPooledObjects.clear();
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?