정의
객체 풀은 초기화되고 사용할 수있는 객체 모음입니다. 수영장 사용자는 수영장에서 물체를 얻고 작동하여 작동하지 않으면 수영장으로 돌아갈 수 있습니다.
초기화와 인스턴스화가 비싸고 자주 인스턴스화해야하지만 한 번에 인스턴스화 횟수가 적 으면 객체 풀을 사용하여 상당한 성능 향상을 달성 할 수 있습니다. 수영장에서 물체를 얻는 시간은 예측 가능하지만 새 인스턴스를 만드는 데 걸리는 시간은 확실하지 않습니다.
성취하다
1. 재사용 가능한 - 객체 풀의 물체, 일반적으로 인스턴스화 비용은 비교적 높습니다.
2. 클라이언트 - 객체의 인스턴스를 사용하십시오.
3. ReusablePool- 대상의 인스턴스화, 재활용 및 파괴를 관리합니다.
단일 사례의 주요 아이디어
1. 스택, 여기 더미가 있습니다
2. 초기화 방법, 컨테이너가 열리면 풀을 사전 제작할 수 있습니다.
3. 인스턴스를 생성하는 방법
4. 풀에서 객체 인스턴스를 얻는 방법을 제공합니다.
5. 반환 방법을 제공하지만 결과는 심각합니다.
6. 요청 대기 시간을 제어하는 방법. 특정 이벤트가 통과되면 널 포인터가 반환됩니다.
Java.util.stack 가져 오기; @suppresswarnings ( "확인되지 않은") public class objectpool {public 객체 pool () {} private poolparam poolparam; public void setpoolparam (poolparam poolparam) {this.poolparam = poolparam; } // 현재 객체의 총 수 개인 int currentNum = 0; 개인 수업 클라즈; Public Void Setclazz (클래스 클라즈) {this.clazz = Clazz; } // 스택은 객체를 저장하고 풀 개인 스택 스택을 시뮬레이션하는 데 사용됩니다. public stack getStack () {return stack; } public void setstack (스택 스택) {this.stack = 스택; } // .................................................................... // 개인 int timewait = 0을 만료하기 위해 시간 초과를 기다리고 있습니다. // .................................................................... // 객체 풀 생성 공개 void initialpool (poolparam poolparam, class clazz) {this.setpoolparam (poolparam); this.setclazz (Clazz); 스택 = 새 스택 (); stack.clear (); // system.out.println ( "obj..pool은 초기 ..."); // 구성 할 최소 객체 수를 생성하여 스택으로 눌러 {or (int i = 0; i <poolparam.getMinoBjectCount (); i ++) {// poolparam stack.push (clazz.newinstance ())에 따라 객체 풀을 초기화합니다. }} catch (InstantiationException e) {e.printstacktrace (); } catch (delegalAccessException e) {e.printstacktrace (); }} // 단일 객체 생성 개인 객체 CreateObj (클래스 클레이즈) {Object obj = null; try {obj = clazz.newinstance (); // system.out.println ( "새 것 ..."); } catch (InstantiationException e) {e.printstacktrace (); } catch (delegalAccessException e) {e.printstacktrace (); } return obj; } // 객체 풀에서 제공 한 메소드를 가져옵니다 public object getInstance () {// system.out.println (stack.size ()); 객체 객체 = null; if (stack.size () == 0) {// 현재 스택의 길이가 0이면 총 객체 수가 최대 정의 된 숫자를 초과하지 않으면 ((currentNum + poolparam.getMinObjectCount ()) <poolparam .getMaxObjectCount ()) {// 새 개체 생성 = this.createObj (Clazz); // 객체 수 +1 currentNum ++; } else {synchronized (this) {try {waitme (this); } catch (예외 e) {e.printstacktrace (); } // 알림을 얻은 후 스택이 비어 있고 (! stack.empty ()) {object = stack.pop (); }}}} else if (stack.size ()> 0) {object = stack.pop (); // system.out.println (stack.size ()); } 반환 객체; } // 객체를 반환하는 메소드 public void returnObj (object obj) {if (clazz.isinstance (obj)) {stack.push (obj); 동기화 된 (this) {notify (); }} else {System.out.println ( "이 개체는 스택으로 밀 수 없습니다!"); }} // 재귀 알고리즘을 기다립니다 Private void waitme (ObjectPool Pool) {// 2S의 기술 제어를 기다립니다. timewait = 0; 반품; } else {try {pool.wait (500); // 수가 축적 될 때까지 기다립니다. . Timewait += 1000; System.out.println ( "무료 OBJ .."); if (stack.empty ()) {System.out.println ( "Agian ...."); 대기 시간 (수영장); }} catch (InterruptedException e) {e.printstacktrace (); }}}}
풀 클래스 관리, 이것은 그리 어렵지 않습니다. 동기화하는 것이 좋습니다.
@SuppressWarnings ( "확인되지 않은") public class objectPoolManage {private objectPoolManage () {} private static objectpool pool; // 싱글 톤의 획득 방법을 구현합니다 ... 기본 공개 정적 동기화 된 ObjectPool getCacheObject (클래스 Clazz) {if (null! = pool) {return Pool; } else {CreateObjectPool (null, Clazz); 리턴 풀; }} // 싱글 톤의 획득 메소드 구현 ... 사용자 정의 공개 정적 동기화 된 ObjectPool getCacheObject (poolparam p, class clazz) {if (null! = pool) {return pool; } else {CreateObjectPool (P, Clazz); 리턴 풀; }} private static objectpool createobjectpool (poolparam p, class clazz) {pool = new ObjectPool (); if (null == p) {pool.initalpool (새 poolparam (5,10), Clazz); } else {pool.initalpool (p, clazz); } 리턴 풀; } private static class getClazz () {class clazz = null; try {clazz = class.forname (ppp.getPropertyByname ( "ObjectPath")); } catch (classNotFoundException e) {e.printstacktrace (); } Clazz를 반환합니다. }}
관련 질문 및 구현
1. 객체 풀에서 물체의 수를 제한 할 수 있습니다. 한계가 한계를 초과하면 객체 풀은 고객에게 알리기 위해 예외 또는 널 값을 반환해야합니다.
2. 다중 스레드 환경에서는 체크 아웃 및 체크인 방법을 동기화해야합니다.
3. 정기적으로 만료 된 물체를 정리하십시오.