问大家如何设计对象池?
如何设计让对象在内存中快速存取!
如何设计让对象在内存中快速存取!
如果有人熟悉apache.org的commons中的objectpool也可以谈谈心得!
很简单啊,自己弄一个Vector,循环引用就可以了吧?
我也想知道,能不能详细点,比如不仅仅是进出的问题吧,关于对象集合从对象池的选取问题,如何检查对象集合的大小,对这个还很不懂啊
我在自己写的聊天室中设计的通用Pool基类,线程池、连接池、对象池等只要集成这个基类,并实现其
protected abstract Object creat();
protected abstract void close(Object obj);
方法即可。小弟我乃java初学者,程序虽然能用,但可能写得很幼稚,还请各位高手指教一下。
get()从池中获取对象
free()把对象还回池中
clear()清洗池
getObjectCount()获取池中存在的对象数目
getActiveObjectCount()获取目前在池外工作的对象数目
elements()获取池中所有对象的数组
package huzq.Pools;
import java.util.*;
public abstract class Pool{
private Vector buffer;
private int objectCount;
private int maxObject;
public Pool(int maxObject){
this.maxObject = maxObject;
objectCount = 0;
buffer = new Vector(maxObject);
}
protected abstract Object creat();
protected abstract void close(Object obj);
private Object _get(){
Object obj = null;
if (buffer.isEmpty()){
if (objectCount < maxObject){
obj = creat();
objectCount++;
}
}else{
obj = buffer.elementAt(0);
buffer.removeElementAt(0);
}
return obj;
}
public Object get(){
Object obj = _get();
synchronized(this){
while(obj == null){
Thread.yield();
try{wait();}catch(Exception e){}
obj = _get();
}
notifyAll();
}
return obj;
}
public synchronized void free(Object obj){
buffer.addElement(obj);
notifyAll();
}
public synchronized void setMaxSize(int maxSize){
clear();
this.maxObject = maxSize;
buffer.setSize(maxSize);
}
public int getObjectCount(){
return objectCount;
}
public int getActiveObjectCount(){
return objectCount - buffer.size();
}
public synchronized void clear(){
if (buffer.isEmpty())
return;
while(getActiveObjectCount() > 0){
Thread.yield();
try{wait();}catch(Exception e){}
}
Object[] e = elements();
for(int i=0; i<e.length; i++)
close(e);
buffer.removeAllElements();
objectCount = 0;
notifyAll();
}
public synchronized Object[] elements(){
if (buffer.isEmpty()){
return null;
}
while(getActiveObjectCount() > 0){
Thread.yield();
try{wait();}catch(Exception e){}
}
Object[] o = new Object[objectCount];
Enumeration e = buffer.elements();
int i = 0;
while(e.hasMoreElements()){
o = e.nextElement();
i++;
}
return o;
}
}
中家 代码不错,线程编码难度很高,还是建议使用Jakarta的Common包中的池
请教:
做完这个对象池,如何让其保存在内存中多用户共享??
可以多用户,注意同步就可以
> 请教:
> 做完这个对象池,如何让其保存在内存中多用户共享??
使用静态的对象,但是要注意安全,或者使用ThreadLocal
使用ThreadLocal是个好主意,好像用这个的人不多。