对象池


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);
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值