直接贴代码了。就两个类、两个文件。
package resourcePool;
import java.io.IOException;
/**
* this interface describes a factory producing some kind of resource,
* such as data base connection, networking connection, etc.
*
* that resource should be configured by the configuration file
*
*
* @author Charles Zhu (azhu1123@gmail.com)
*
* @param <T> the resource kind
*/
public interface ResourceFactory<T> {
/**
* configure the resource by the configuration file.
*
* @param configurationFilePath the path of the configuration file
* @throws IOException will be thrown while the file indicated by that path is invalid.
*/
public void configure (String configurationFilePath) throws IOException;
/**
* produce one resource conform to the configuration
*
* @return the product - the applying resource
*/
public abstract T newResource () ;
}
package resourcePool;
import java.util.*;
/**
* this class implements a pool for some kind of resource
*
* that resource should be the product of the ResourceFactory.
* the resource are stored in a list maintain in it.
* they can be applied and returned back.
* finally, all of them should be destroyed.
*
*
* @author Charles Zhu (azhu1123@gmail.com)
*
* @param <T> the resource kind
*/
public class ResourcePool <T> {
private List<T> allResource;
private final int poolSize;
private volatile int inUsed = 0;
private volatile int totalUsed = 0;
public ResourcePool (int size, ResourceFactory<T> f) {
this.poolSize = size;
this.allResource = Collections.synchronizedList(new ArrayList<T>());
for(int i = 0; i < size; i++)
allResource.add(f.newResource());
}
public synchronized T apply () {
while ( allResource.isEmpty() )
{
try {
wait();
} catch (InterruptedException e) {
System.err.println(e.getMessage());
return null;
}
}
totalUsed ++;
return (T)allResource.remove(inUsed ++);
}
public synchronized void returnBack (T t) {
allResource.add(t);
inUsed --;
notifyAll();
}
public int inUsed () {
return this.inUsed;
}
public int availableNumber () {
return poolSize - inUsed;
}
public void shutDown () {
//TODO: 关闭所有资源
//for(T r : allResource)
}
}
觉得有兴趣的同志同学,使用后请联系我告诉你使用后的系统性能,以及修改。
如果觉得已有更好的通用实现,请联系我,一起学习。