`
javazeke
  • 浏览: 86943 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

java简单对象池

阅读更多

在项目中用到,自己写了个对象池的管理(创建、保留、获取),那种服务器空闲下来再回收的技术。没搞明白是怎么弄得,就没能写出回收部分,还有请求时有队列的管理,我认为这个在并发的程序中用处也不是很大吧,就也没实现。

呵呵,,看下来是不是基本没什么东西啊,,你对了!!!

 

首先,不管池中放多少,先把单个实例及附属方法弄出来,

单个实例中主要的思想

1.一个栈,这里用stack

2.初始化方法,容器开启的时候可以预先创建池

3.创建实例的方法

4.提供从池中获得对象实例的方法

5.提供返回的方法,不返回后果很严重

6.控制请求等待时间的方法,过了一定的事件还没获得对象实例,就返回一个null指针

import java.util.Stack;

@SuppressWarnings("unchecked")
public class ObjectPool {

	public ObjectPool() {
	}

	private PoolParam poolParam;

	public void setPoolParam(PoolParam poolParam) {
		this.poolParam = poolParam;
	}

	// 当前总对象个数
	private int currentNum = 0;

	private Class clazz;

	public void setClazz(Class clazz) {
		this.clazz = clazz;
	}

	// 栈,用来存放对象,模拟一个池
	private Stack stack;

	public Stack getStack() {
		return stack;
	}

	public void setStack(Stack stack) {
		this.stack = stack;
	}

	// .................................................................
	// 等待超时的记数变量
	private int timeWait = 0;

	// .................................................................

	// 创建对象池
	public void initalPool(PoolParam poolParam, Class clazz) {

		this.setPoolParam(poolParam);
		this.setClazz(clazz);

		stack = new Stack();

		stack.clear();

		// System.out.println("obj..pool is initial...");
		// 生成配置最小对象数,并压入栈中
		try {

			for (int i = 0; i < poolParam.getMinObjectCount(); i++) {

				// 根据poolParam初始化对象池
				stack.push(clazz.newInstance());
			}

		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}

	}

	// 创建单个对象
	private Object createObj(Class clazz) {

		Object obj = null;
		try {

			obj = clazz.newInstance();

			// System.out.println("a new one...");
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}

		return obj;
	}

	// 对象池提供的get方法
	public Object getInstance(){

		// System.out.println(stack.size());

		Object object = null;

		if (stack.size() == 0) {

			// 如果当前栈的长度为0,并且总的对象数没有超过定义最大数
			if ((currentNum + poolParam.getMinObjectCount()) < poolParam
					.getMaxObjectCount()) {

				// 新创建一个对象
				object = this.createObj(clazz);
				// 对象数+1
				currentNum++;

			} else {

				synchronized (this) {

					try {
						waitme(this);
					} catch (Exception e) {
						e.printStackTrace();
					}

					// 获得通知后检测栈中是为空,并给出刚刚释放的资源
					if (!stack.empty()) {
						object = stack.pop();
					}
				}
			}

		} else if (stack.size() > 0) {

			object = stack.pop();

			// System.out.println(stack.size());
		}

		return object;
	}

	// 返回对象的方法
	public void returnObj(Object obj) {

		if (clazz.isInstance(obj)) {

			stack.push(obj);

			synchronized (this) {

				notify();
			}
		} else {
			System.out.println("this object can not push to stack!");
		}

	}

	// 等待递归算法
	private void waitme(ObjectPool pool) {

		// 等待2s的技术控制
		if (timeWait >= 2000) {
			System.out.println("jump up this step..");

			timeWait = 0;
			return;

		} else {

			try {

				pool.wait(500);

				// 等待计数累加。。
				timeWait +=1000;

				System.out.println("waiting time to free obj..");

				if (stack.empty()) {
					System.out.println("agian....");
					waitme(pool);
				}

			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

 

管理池类,这个不是很难,同步了就好

 

@SuppressWarnings("unchecked")
public class ObjectPoolManage {

	private ObjectPoolManage() {
	}

	private static ObjectPool pool;
	


	// 实现一个单例的获取方法....默认
	public static synchronized ObjectPool getCacheObject(Class clazz) {

		if (null != pool) {
			return pool;
		} else {

			createObjectPool(null, clazz);
			return pool;
		}

	}

	// 实现一个单例的获取方法...自定义

	public static synchronized ObjectPool getCacheObject(PoolParam p, Class clazz) {
		if (null != pool) {
			return pool;
		} else {

			createObjectPool(p, clazz);
			return pool;
		}

	}

	private static ObjectPool createObjectPool(PoolParam p, Class clazz) {

		pool = new ObjectPool();

		if (null == p) {
			pool.initalPool(new PoolParam(5,10), clazz);
		} else {
			pool.initalPool(p, clazz);
		}

		return pool;
	}
	
	private static Class getclazz(){
		
		Class clazz=null;
		
		try {
			clazz= Class.forName(ppp.getPropertyByName("objectPath"));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		return clazz;
	}
}

 

 

这个不是很难吧,和Apache下的那个pool差距很大啊,不过用还是够了。当然了,这里面肯定有不确定的因素会影响到,比如:效率,安全啊,什么的。。。希望大牛看到能为我指出,我感激不及,真的!

0
1
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Java对象池实现源码

    下面是一个简单的Java对象池实现,以`ObjectPool`类为例: ```java import java.util.ArrayList; import java.util.List; public class ObjectPool&lt;T&gt; { private List&lt;T&gt; pool; private ObjectFactory&lt;T&gt; ...

    关于java对象池的例子代码

    下面是一个简单的Java对象池实现示例: ```java import java.util.Stack; public class ObjectPool&lt;T&gt; { private Stack&lt;T&gt; pool = new Stack(); public ObjectPool(int initialSize, Supplier&lt;T&gt; creator) { ...

    Java对象池技术的原理及其实现

    ### Java对象池技术的原理及其实现 #### 一、对象池的概念与作用 对象池是一种软件设计模式,主要用于管理那些频繁创建与销毁且代价较高的对象。通过预先创建一定数量的对象,并将其保存在一个集合(通常称为池)...

    线程池与对象池的融合

    这是一个很简单的实现啦对象池与线程池的融合,方法的主要参数,线程池大小、对象池大小、对象的创建工厂(继承接口自己实现),执行时传入方面名称即可。(invoke方法第一个为参数为方法名,第二是可变参数(及方法...

    基于java的对象池实现.zip

    本教程将深入探讨如何在Java中实现一个简单的对象池。 首先,我们需要定义对象池的基本结构。一个对象池通常包含两个主要部分:存储池中对象的数据结构(例如数组或集合)以及管理这些对象的方法。在Java中,我们...

    工厂设计模式附加对象池说明

    本资源包含两部分:工厂设计模式和对象池的设计与实现,主要面向Java开发者。 首先,我们来深入理解工厂设计模式。工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需暴露创建逻辑,同时允许...

    探讨Java的对象是怎么在内存中产生的?

    Java对象的创建不仅仅涉及到简单的`new`关键字操作,而是包含了类加载检查、内存分配、对象初始化等多个步骤。同时,对象在内存中的布局也非常重要,它不仅决定了对象的存储方式,还直接影响到程序的性能表现。通过...

    对象池

    这个压缩包包含三个文件:`ObjectPool.java`、`Test.java`和`TestObject.java`,分别代表了对象池的实现、测试类以及一个用于测试的对象类。 `ObjectPool.java` 文件很可能实现了对象池的基本逻辑。它可能包括以下...

    对象池工厂(微型IOC容器)

    7. **接口设计**:提供简单的API供其他组件请求和返回对象,使得对象池易于集成。 在实际应用中,对象池常用于数据库连接池、线程池等场景,通过复用资源来提升系统的响应速度和整体性能。对于开发者来说,理解并...

    apache对象池的实现

    以下是一个简单的Apache对象池实现示例,以创建一个基于`GenericObjectPool`的String对象池: ```java import org.apache.commons.pool2.impl.GenericObjectPool; import org.apache.commons.pool2.impl....

    java数据库连接池

    以下代码片段展示了如何在Java中实现一个简单的数据库连接池: ```java public class BaseDao { private String dbUrl = ""; // 数据库URL private String jdbcDriver = ""; // JDBC驱动 private String ...

    JAVA数据库连接池

    DBCP(Jakarta Commons DBCP)是Apache的一个开源项目,它基于Apache的Commons Pool对象池机制实现。DBCP提供了一个基本的、易于配置的数据库连接池。使用DBCP,开发者需要配置数据库URL、用户名、密码等信息,并...

    java连接池实例.doc

    DBCP提供了一种简单的API来管理和维护数据库连接池,从而避免了每次请求都创建新的数据库连接所带来的性能开销。DBCP支持配置最大连接数、最小空闲连接数等参数,可以根据实际需求进行灵活调整。 #### 三、Java连接...

    Java 连接池实现

    2. **连接池**:连接池是一个对象池,存储已创建的数据库连接。应用程序在需要时从池中获取连接,使用完毕后归还,而不是直接关闭。这样可以减少创建和销毁连接的次数,提高系统性能。 3. **配置文件**:在手动实现...

    java设计模式之实现对象池模式示例分享

    对象池模式是一种设计模式,它在Java编程中用于管理和重用昂贵资源,如数据库连接、线程或网络套接字,以减少系统性能开销。当频繁创建和销毁这些资源时,对象池模式能显著提高效率。在描述的示例中,我们看到一个...

    java连接池可以自己更换数据库

    ### Java连接池自定义更换数据库实现解析 #### 概述 在Java开发中,数据库连接是应用程序与数据库之间通信的关键环节。为了提高性能并有效管理这些连接,通常会使用数据库连接池来统一管理数据库连接资源。本文将...

    java对象缓冲实现中间件

    Java对象缓冲实现中间件是一种高效的数据存储和访问机制,它通过在内存中创建一个对象池来减少对硬盘或网络资源的频繁访问,从而提高应用程序的性能。这种中间件设计的核心理念是利用内存的高速访问特性,将常用或者...

Global site tag (gtag.js) - Google Analytics