发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 CQRS 扩展性 并发编程 事件溯源 分布式 SOA
1 2 下一页 Go 2

问大家如何设计对象池?

    
2004-03-16 16:44
赞助商链接

如何设计让对象在内存中快速存取!

2004-03-16 16:46

如果有人熟悉apache.org的commons中的objectpool也可以谈谈心得!

2004-05-31 11:08

很简单啊,自己弄一个Vector,循环引用就可以了吧?

2004-05-31 11:14

我也想知道,能不能详细点,比如不仅仅是进出的问题吧,关于对象集合从对象池的选取问题,如何检查对象集合的大小,对这个还很不懂啊

2004-05-31 14:03

我在自己写的聊天室中设计的通用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;
}
}

2Go 1 2 下一页

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com