`
javazeke
  • 浏览: 85475 次
  • 性别: 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
分享到:
评论
发表评论

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

相关推荐

    线程池与对象池的融合

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

    对象池&线程池&数据库连接池

    最简单高效的JAVA对象池、线程池、以及使用对象池技术实现的数据库连接池 已在生产运行5年以上的代码 若有任何问题请与我联系

    stormpot:JVM的快速对象池

    Stormpot是Java的对象池库。 用它来回收创建成本很高的对象。 该库将负责在后台创建和销毁您的对象。 Stormpot非常成熟,已在生产中使用,并且已经在测试中完成了数百万亿[ ]个声明发布周期。 它比任何竞争池都更...

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

    对象池模式经常用在频繁创建、销毁对象(并且对象创建、销毁开销很大)的场景,比如数据库连接池、线程池、任务队列池等。本代码简单,没有限制对象池大小

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式...

    JAVA上百实例源码以及开源项目

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    [java]读书笔记整理:一切都是对象

    一种通用的内存池(也位于RAM区),用于存放所有的java对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当...

    JAVA上百实例源码以及开源项目源代码

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    java开源包11

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包6

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包9

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包4

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包101

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包5

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包8

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包10

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    Java数据编程指南

    一些Java细节 设计性事务处理 铭记要点 小结 第21章 开发EJB客户机 引言 EJBs的客户机 小结 第22章 开发可扩缩的EJB应用程序 引言 Enterprise JavaBeans的优点 EJB的广阔开放空间...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题05.java面向对象的特征.mp4 │ Java面试题06.装箱和拆箱.mp4 │ Java面试题07.==和equals的区别.mp4 │ Java面试题08.String.mp4 │ Java面试题09.讲一下java中的集合.mp4 │ Java面试题10.ArrayList ...

    java开源包3

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

Global site tag (gtag.js) - Google Analytics