`
fbj203
  • 浏览: 3042 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

对象池

阅读更多
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;



public class ObjectPool {
	
	private int objectNum = 100;	//对象总数
	
	private Class c = TestObject.class;	//当前对象类型
	private List<Object> avaiObjects; // 空闲对象集合
	private List<Object> objects;	//总对象集合
	private static ObjectPool objectPool;
	
	private long timeOut = 2000;
	private boolean flag;	//是否已经初始化了
	private ObjectPool(){
		//init
		if(objectNum > 0){
			avaiObjects = new LinkedList<Object>();
			
			objects = new ArrayList<Object>();
			Object object = null;
			for(int i = 0 ; i < objectNum ; i++){
				try {
					object = c.newInstance();
					avaiObjects.add(object);
					objects.add(object);
					
					object = null;
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} 
			}
			flag = true;
			System.out.println("程序初始化完成,max=" + objectNum + ",class=" + c );
		}else {
			throw new RuntimeException("对象数目不可小于0");
		}
		
	}
	
	public static synchronized ObjectPool getInstance(){
		if(objectPool == null)
			objectPool = new ObjectPool();
		return objectPool;
	}
	
	/**
	 * 得到一个可用的对象
	 * @return
	 */
	public Object getAviObject(){
		
		Object object = getObject();
		if(object == null){
			try {
				System.out.println("等待");
				Thread.currentThread().sleep(timeOut);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			object = getObject();
			
		}
		return object;

		
	}
	
	/**
	 * 归还一个已经用完的对象
	 * @return
	 */
	public synchronized boolean closeObject(Object object , String name){
		
		if(object != null){
			avaiObjects.add(object);
			System.out.println(name + "归还:"+avaiObjects.size());
		}else {
			System.out.println(name + "归还null:"+avaiObjects.size());
		}
		return false;
	}

	public synchronized Object getObject(){
		
		if(avaiObjects.size() > 0){
			try {
				System.out.println("外借:"+avaiObjects.size());
				return avaiObjects.get(0);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				avaiObjects.remove(0);
				
			}
		}else{
			System.err.println("无可用对象");

		}
		return null;
	}
	public synchronized int aviObjectCount(){
		return avaiObjects.size();
	}
}



import java.util.Random;



public class Test {
	private static int count=0;
	public static void main(String[] args) {
		for (int i = 0; i < 1000; i++) {
			
			new Thread(new Runnable() {
				
				public void run() {
					int time = 300;
					String name = Test.get();
					while (true) {
						System.out.println("活跃线程:"+Thread.activeCount());
						TestObject testObject = (TestObject)ObjectPool.getInstance().getAviObject();
						if(testObject == null)
							continue;
						
						try {
							System.out.println(name + "休眠" + time);
							Thread.currentThread().sleep(time);
							//if(time <2000)
								//time +=300;
							System.out.println(name + "醒来");
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						testObject.println(name);
						ObjectPool.getInstance().closeObject(testObject , name);
						
						try {
							
							Thread.currentThread().sleep(new Random().nextInt(3000));
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						
					}
					
				}
			} , "test").start();
			
			
		}
		
	}
	
	public static synchronized String get(){
		return "线程" + count++;
	}

}




public class TestObject {
	
	public void println(String s){
		System.out.println(s);
	}

}

分享到:
评论
2 楼 zhouqiugang 2011-08-24  
while true 
1 楼 zhouqiugang 2011-08-24  
怎么循环1000,但是我运行下Test,线程一直在跑。像是死循环。

相关推荐

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

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

    Unity 工具类 之 简单的对象池管理类 ObjectPoolManager 实现

    Unity 工具类 之 简单的对象池管理类 ObjectPoolManager 实现 1、单例类,保证整个场景中只有一个类管理对象池; 2、把需要的对象以对象池形式管理起来,需要的时候 拿出来显示即可,不需要的时候隐藏以来即可; ...

    UE4 Actor对象池插件

    在这个场景中,"UE4 Actor对象池插件"是一个专门针对UE4设计的工具,用于优化游戏性能,特别是处理大量动态对象的创建和销毁。对象池是一种内存管理策略,它预先创建并存储一组对象,当需要时可以从池中获取,而不是...

    高效的,固定大小的对象池

    在计算机科学和编程领域,对象池是一种内存管理策略,它预先创建并维护一组对象,以供重复使用,而不是每次需要时都创建新对象。这种方式可以显著提高程序性能,特别是对于那些生命周期短暂但创建成本较高的对象。...

    deePool高效的JavaScript对象池

    为了解决这个问题,开发者们引入了“对象池”概念, DeePool 就是一个实现这一概念的高效JavaScript库。本文将深入探讨DeePool的工作原理、优势以及如何在实际项目中应用。 ### DeePool简介 DeePool 是一个专为...

    Unity 对象池插件 Easy ObjectPool 2.0

    Unity 轻量高效对象池插件 // // 摘要: // 首次加载是否完成 public static bool firstPreloadFinish { get; } // // 摘要: // 获取实例 public static EasyObjectPool GetInstance(); // // 摘要: //...

    Unity中对象池插件

    Unity中的对象池是一种优化游戏性能的技术,主要用于管理游戏对象,如敌人、子弹或者特效等,以减少频繁创建和销毁对象带来的开销。对象池插件是实现这一技术的工具,它可以自动化地管理游戏对象的生命周期,提高...

    C#自定义对象池

    在C#编程中,对象池是一种优化资源管理的技术,它主要用于减少对象的创建和销毁的开销。在数据库操作中,频繁地打开和关闭数据库连接会导致大量的系统资源消耗,包括内存和CPU时间。通过实现自定义的对象池,我们...

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

    ### Java对象池技术的原理及其实现 #### 摘要 本文深入探讨了Java对象池技术的基本原理及其实现方式,旨在帮助读者理解如何利用对象池优化Java应用程序的性能。通过对对象池技术核心概念——缓存与共享的阐述,本文...

    对象池简单Demo(资源包)

    对象池在计算机科学,尤其是游戏开发领域,是一个重要的设计模式,它主要应用于管理频繁创建和销毁的对象,以提高性能和优化资源使用。Unity引擎中,对象池被广泛应用于游戏对象的生命周期管理,如敌人、子弹或者...

    unity子弹对象池详细注释

    在Unity游戏开发中,对象池是一种优化资源管理的技术,它能有效地减少对象的频繁创建与销毁,从而提高游戏性能。本教程将详细讲解基于Unity的子弹对象池实现,以及如何通过注释理解并扩展其功能。 一、对象池概念 ...

    Java对象池实现源码

    在Java编程中,对象池是一种优化资源管理的技术,它的核心思想是预先创建并维护一组对象,供程序在需要时重复使用,而不是每次需要时都创建新的对象。这有助于减少对象的创建和销毁带来的开销,特别是在频繁创建和...

    对象池 射击游戏 子弹的反复生成

    对象池是一种在软件开发中,特别是游戏开发中广泛使用的优化技术。它的主要目的是为了提高程序性能,减少系统资源的频繁创建和销毁,特别是在处理大量短暂生命周期的对象时,如射击游戏中频繁生成和消失的子弹。 在...

    性能优化_对象池

    "对象池"是一种常见的性能优化策略,它针对的是频繁创建和销毁对象所导致的性能损失。本文将深入探讨对象池的概念、工作原理以及在实际应用中的优势和注意事项。 对象池的基本思想是预先创建并维护一组对象,而不是...

    unity对象池的案例Demo

    Unity对象池是一种优化游戏性能的技术,它通过预先创建并存储一系列可重用的游戏对象,避免了频繁的对象实例化和销毁过程,从而减少了内存碎片和CPU开销。在本案例Demo中,我们将深入探讨Unity对象池的工作原理、...

    用Dictionary写的对象池

    对象池是一种在软件开发中用于优化资源管理的技术,它的核心思想是预先创建并维护一组对象,以便在需要时快速分配,而不是每次都新建对象。这种方式可以减少频繁创建和销毁对象带来的性能开销,尤其是在处理大量短...

    apache对象池的实现

    Apache对象池技术是一种高效利用资源的策略,它通过预先创建并维护一组可重用对象来减少频繁创建和销毁对象带来的开销。在Java环境中,Apache Commons Pool库是实现对象池的常见工具,它提供了多种对象池实现,适用...

    Unity对象池的理解和使用

    对于对象池的优化逻辑其实是见仁见智的,并不是随随便便就拿来用,其实很多时候我们并不需要通过对象池来处理,通过对象池的主要目的是: 防止对象被频繁的创建和删除,从而内存抖动、频繁GC(垃圾回收)对象初始化...

    Unity做的对象池小案例

    首先,理解对象池的基本原理:对象池管理一组已创建的对象,而不是在需要时创建新对象,而是从池中获取已存在的、但当前未使用的对象。这种方式避免了频繁的`new`操作和垃圾回收带来的开销。在Unity中,对象池通常...

Global site tag (gtag.js) - Google Analytics