Definition
Ein Objektpool ist eine Sammlung von Objekten, die initialisiert und verwendbar wurden. Der Benutzer des Pools kann Objekte aus dem Pool erhalten, sie betreiben und sie in den Pool zurückgeben, anstatt sie zu zerstören, wenn nicht.
Wenn die Initialisierung und Instanziierung teuer sind und häufig die Instanziierung instanziiert werden muss, aber die Anzahl der Instanziationen zu einem Zeitpunkt gering ist, kann eine erhebliche Leistungsverbesserung unter Verwendung von Objektpools erzielt werden. Die Zeit, ein Objekt aus dem Pool zu bekommen, ist vorhersehbar, aber die Zeit, die für die Erstellung einer neuen Instanz benötigt wird, ist ungewiss.
erreichen
1. wiederverwendbar - Objekte im Objektpool, in der Regel sind die Kosten der Instanziierung relativ hoch.
2. Client - Verwenden Sie eine Instanz eines Objekts.
3.. WiederverwendbaresPool - Verwaltet die Instanziierung, Recycling und Zerstörung von Objekten.
Die Hauptideen in einer einzigen Instanz
1. Ein Stapel, hier ist Stack
2. Initialisierungsmethode, Sie können den Pool beim Öffnen des Behälters voraberstellen.
3. Methoden zum Erstellen einer Instanz
4. Geben Sie eine Methode an, um Objektinstanzen aus dem Pool zu erhalten
5. Geben Sie eine Rückgabemethode an, aber die Konsequenzen sind schwerwiegend.
6. Methode zur Steuerung der Wartezeit. Nach Ablauf eines bestimmten Ereignisses wird ein Nullzeiger zurückgegeben.
import Java.util.stack; @Suppresswarnings ("Deaktiviert") öffentliche Klasse ObjectPool {public ObjectPool () {} private poolparam poolparam; public void setpoolparam (poolparam poolparam) {this.poolparam = poolparam; } // Die aktuelle Gesamtzahl der Objekte private int currentnum = 0; Privatklasse Clazz; public void setClazz (Klasse Clazz) {this.clazz = clazz; } // Der Stapel wird verwendet, um Objekte zu speichern und einen privaten Pool -Stapel zu simulieren. public stack getStack () {return stack; } public void setStack (Stack Stack) {this.stack = stack; } // ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. // ......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... this.setClazz (Clazz); stack = new Stack (); stack.clear (); // system.out.println ("obj..pool ist initial ..."); // generieren Sie die minimale Anzahl von Objekten, um sie zu konfigurieren und in den Stapel zu treiben. }} catch (InstantiationException e) {e.printstacktrace (); } catch (illegalAccessException e) {e.printstacktrace (); }} // Erstellen Sie ein einzelnes Objekt privates Objekt createObj (Klasse clazz) {Objekt obj = null; try {obj = clazz.newinstance (); // system.out.println ("ein neuer ..."); } catch (InstantiationException e) {e.printstacktrace (); } catch (illegalAccessException e) {e.printstacktrace (); } return obj; } // Methode erhalten, die durch das Objektpool öffentliche Objekt getInstance () {// system.out.println (stack.size ()) erhalten; Objekt Objekt = null; if (stack.size () == 0) {// Wenn die Länge des aktuellen Stapels 0 beträgt und die Gesamtzahl der Objekte die maximal definierte Zahl nicht überschreitet, if (currentnum + poolparam.getminObjectCount ()) <poolParam .getMaxObjectCount ()) {// ein neues Objekt ein neues Objekt = this.createoobj (clazz); // Anzahl der Objekte +1 currentnum ++; } else {synchronized (this) {try {Waitme (this); } catch (Ausnahme e) {e.printstacktrace (); } // Überprüfen Sie nach Erhalt der Benachrichtigung, dass der Stapel leer ist, und gibt der gerade veröffentlichten Ressource if (! Stack.empty ()) {Object = stack.pop (); }}}} else if (stack.size ()> 0) {Object = stack.pop (); // system.out.println (stack.size ()); } Rückgabeobjekt; } // Methode zur Rückgabe des Objekts public void returnObj (Objekt obj) {if (clazz.issinstance (obj)) {stack.push (obj); synchronisiert (this) {benachrichtigen (); }} else {System.out.println ("Dieses Objekt kann nicht zum Stapel drängen!"); }} // Warten Sie auf rekursives Algorithmus private void Waitme (Objektpool Pool) {// Warte auf die technische Kontrolle von 2S if (Timewait> = 2000) {System.out.println ("diesen Schritt hochspringen .."); Zeitwait = 0; zurückkehren; } else {try {pool.wait (500); // Warten Sie, bis sich die Anzahl ansammelt. . Zeitwait += 1000; System.out.println ("Wartezeit für freie obj .."); if (stack.empty ()) {System.out.println ("Agian ...."); Waitme (Pool); }} catch (interruptedException e) {e.printstacktrace (); }}}}
Verwalten Sie Poolklassen, das ist nicht sehr schwierig, es ist gut, ihn zu synchronisieren
@SuppressWarnings ("Deaktiviert") öffentliche Klasse ObjectPoolManage {private ObjectPoolManage () {} privater statischer Objektpool -Pool; // Implementieren Sie die Erhaltungsmethode eines Singleton ... Standard public static synchronisierte Objektpool getCacheObject (Klasse clazz) {if (null! = Pool) {return pool; } else {createObjectpool (null, clazz); Returnpool; }} // Implementieren Sie eine Singleton -Erhaltungsmethode ... benutzerdefinierte öffentliche statische synchronisierte Objektpool getCacheObject (Poolparam p, Klasse clazz) {if (null! = Pool) {return pool; } else {createObjectpool (p, clazz); Returnpool; }} private static ObjectPool createObjectPool (Poolparam p, Klasse clazz) {pool = new ObjectPool (); if (null == p) {pool.initalpool (New Poolparam (5,10), Clazz); } else {pool.initalpool (p, clazz); } Return Pool; } private statische Klasse getClazz () {Klasse clazz = null; try {clazz = class.forname (ppp.getPropertyByName ("ObjectPath")); } catch (classNotFoundException e) {e.printstacktrace (); } return clazz; }}
Verwandte Fragen und Implementierungen
1. Die Anzahl der Objekte kann im Objektpool begrenzt sein. Wenn die Grenze die Grenze überschreitet, muss der Objektpool eine Ausnahme oder einen Nullwert zurückgeben, um den Kunden zu benachrichtigen.
2. In einer Umgebung mit mehreren Threaden müssen die Methoden zur Kasse und der Checkin-Methoden synchronisiert werden.
3.. RELANDEN OUT OUT OUT OUT OUT OUT OUT OUT OUT OUT OUT OUT OUT OUT OUT OUT OUT AUSGEGEBEN.