определение
Пул объектов - это коллекция объектов, которые были инициализированы и пригодны для использования. Пользователь пула может получить объекты из бассейна, работать на них и вернуть их в бассейн вместо того, чтобы уничтожить его, если нет.
Если инициализация и экземпляры являются дорогостоящими, и необходимо часто создавать экземпляр, но количество экземпляров невелико за раз, можно достичь значительного улучшения производительности с использованием пулов объектов. Время получить объект из пула является предсказуемо, но время, необходимое для создания нового экземпляра, неясно.
выполнить
1. многоразовый - объекты в пуле объектов, обычно стоимость экземпляра относительно высока.
2. Клиент - используйте экземпляр объекта.
3. повторноразовый пул - управляет экземплярами, утилизацией и разрушением объектов.
Основные идеи в одном случае
1. Стек, вот стек
2. Метод инициализации, вы можете предварительно создать пул, когда контейнер открыт.
3. Методы создания экземпляра
4. Предоставьте метод получения экземпляров объекта из пула
5. Предоставьте метод возврата, но последствия являются серьезными.
6. Метод управления временем ожидания запроса. После того, как определенное событие прошло, возвращается нулевый указатель.
импортировать java.util.stack; @Suppresswarnings ("unchecked") public class objectpool {public objectpool () {} private poolparam poolparam; public void setpoolparam (poolparam poolparam) {this.poolparam = poolparam; } // текущее общее количество объектов частное int currentnum = 0; Частный класс Clazz; public void setclazz (класс Clazz) {this.clazz = clazz; } // стек используется для хранения объектов и имитации стека отдельных стеков пула; public Stack getStack () {return Stack; } public void setStack (стек стека) {this.Stack = stack; } // ...................................................................... // Ожидание тайм -аута истекает частное время intwait = 0; // ............................................................................ // Создание объектного пула public void initialPool (PoolParam PoolParam, Class Clazz) {this.setPoolParam (PoolParam); this.setclazz (clazz); Stack = new Stack (); stack.clear (); // System.out.println ("obj..pool Iment ..."); // Сгенерировать минимальное количество объектов для настройки и вставки его в стек Try {for (int i = 0; i <poolparam.getminobjectcount (); i ++) {// Инициализировать пул объектов в соответствии с poolparam stack.push (clazz.newinstance ()); }} catch (instantiationException e) {e.printstacktrace (); } catch (allogalaccessexception e) {e.printstacktrace (); }} // Создать один объект частного объекта createObj (class clazz) {Object obj = null; try {obj = clazz.newinstance (); // System.out.println ("новый ..."); } catch (instantiationException e) {e.printstacktrace (); } catch (allogalaccessexception e) {e.printstacktrace (); } вернуть obj; } // Получить метод, предоставленный объектом Pool Public Object getInstance () {// system.out.println (stack.size ()); Объект объекта = null; if (stack.size () == 0) {// Если длина текущего стека равен 0, а общее количество объектов не превышает максимально определенное число if ((currentNum + poolparam.getMinobjectCount ()) <poolparam .getMaxObjectCount ()) {// Создать новый объект object = this.createObj (clazz); // количество объектов +1 currentNum ++; } else {synchronized (this) {try {waitme (this); } catch (Exception e) {e.printstackTrace (); } // После получения уведомления убедитесь, что стек пуст и дает ресурс, только что выпущенный, если (! Stack.empty ()) {object = Stack.pop (); }}}} else if (stack.size ()> 0) {object = Stack.pop (); // System.out.println (stack.size ()); } return object; } // Метод возврата объекта public void returnObj (Object obj) {if (clazz.isinStance (obj)) {Stack.push (obj); синхронизированный (это) {notify (); }} else {System.out.println ("Этот объект не может подтолкнуть к стеку!"); }} // ждать рекурсивного алгоритма private void waitme (pool objectpool) {// ждать технического управления 2S if (timewait> = 2000) {System.out.println («Прыгните на этот шаг ..»); TimeWait = 0; возвращаться; } else {try {pool.wait (500); // ждать накопления графа. Полем TimeWait += 1000; System.out.println («Время ожидания, чтобы бесплатно obj ..»); if (stack.empty ()) {System.out.println ("agian ...."); watme (бассейн); }} catch (прерывание Exception e) {e.printStackTrace (); }}}}
Управлять классами пул, это не очень сложно, хорошо его синхронизировать
@Suppresswarnings ("unchecked") public class objectpoolmanage {private objectpoolmanage () {} private static objectPool Pool; // Реализовать метод получения синглтона ... по умолчанию публичный статический синхронизированный ObjectPool getCacheObject (класс clazz) {if (null! = Pool) {return pool; } else {createObjectPool (null, clazz); вернуть бассейн; }} // Реализовать метод получения синглтона ... пользовательский общедоступный статический синхронизированный объект 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); } return Pool; } Частный статический класс getClazz () {class clazz = null; try {clazz = class.forname (ppp.getPropertyByname ("ObjectPath")); } catch (classnotfoundexception e) {e.printstacktrace (); } вернуть Clazz; }}
Связанные вопросы и реализации
1. Количество объектов может быть ограничено в пуле объектов. Когда предел превышает предел, пул объектов должен вернуть исключение или нулевое значение, чтобы уведомить клиента.
2. В многопоточной среде необходимо синхронизировать методы оформления и проверки.
3. Очистите срок действия объектов регулярно.