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