تعريف
تجمع الكائنات عبارة عن مجموعة من الكائنات التي تمت تهيئتها وقابلة للاستخدام. يمكن لمستخدم التجمع الحصول على كائنات من التجمع ، والتشغيل عليها ، وإعادتها إلى المسبح بدلاً من تدميره إن لم يكن.
إذا كانت التهيئة والتثبيت باهظة الثمن ، وكانت هناك حاجة إلى إنشاء مثيل لها بشكل متكرر ، ولكن عدد الاستئصال الصغار في وقت واحد ، يمكن تحقيق تحسين كبير في الأداء باستخدام تجمعات الكائنات. يمكن التنبؤ بوقت الحصول على كائن من التجمع ، لكن الوقت الذي يستغرقه إنشاء مثيل جديد غير مؤكد.
ينجز
1. قابلة لإعادة الاستخدام - الكائنات في تجمع الكائنات ، وعادة ما تكون تكلفة الاستئصال مرتفعة نسبيًا.
2. العميل - استخدم مثيل كائن.
3. REUSablePool - يدير إنشاء الأشياء وإعادة تدوير الأشياء وتدميرها.
الأفكار الرئيسية في حالة واحدة
1. كومة ، هنا مكدس
2. طريقة التهيئة ، يمكنك إنشاء حمام السباحة المسبق عند فتح الحاوية.
3. طرق لإنشاء مثيل
4. توفير طريقة للحصول على مثيلات كائن من التجمع
5. توفير طريقة إرجاع ، ولكن العواقب خطيرة.
6. طريقة للتحكم في وقت الانتظار. بعد مرور حدث معين ، يتم إرجاع مؤشر فارغ.
استيراد java.util.stack ؛ suppressWarnings ("Unchected") الفئة العامة ObjectPool {public ObjectPool () {} pollparam poolparam ؛ public void setpoolparam (poolparam poolparam) {this.poolparam = poolparam ؛ } // العدد الإجمالي الحالي للكائنات الخاصة int currentNum = 0 ؛ الطبقة الخاصة كلز public void setClazz (class clazz) {this.clazz = clazz ؛ } // يتم استخدام المكدس لتخزين الكائنات ومحاكاة مكدس تجمع خاص ؛ المكدس العام getStack () {return stack ؛ } public void setStack (stack stack) {this.stack = stack ؛ } // ....................................................................... // ........................................................ this.setClazz (clazz) ؛ Stack = New Stack () ؛ stack.clear () ؛ // system.out.println ("obj..pool is areal ...") ؛ // قم بإنشاء الحد الأدنى لعدد الكائنات لتكوينه ودفعه إلى المكدس ، Try {for (int i = 0 ؛ i <poolparam.getMinObjectCount () ؛ i ++) {// تهيئة تجمع الكائن وفقًا لـ poolparam stack.push (clazz.newinstance ()) ؛ }} catch (instantiationException e) {e.printStackTrace () ؛ } catch (alfictAccessException e) {e.printStackTrace () ؛ }} // إنشاء كائن واحد كائن خاص createObj (class clazz) {object obj = null ؛ حاول {obj = clazz.newinstance () ؛ // system.out.println ("A جديد ...") ؛ } catch (InstantiationException e) {e.printStackTrace () ؛ } catch (alfictAccessException e) {e.printStackTrace () ؛ } إرجاع OBJ ؛ } // الحصول على طريقة توفرها الكائنات العامة لمجموعة الكائنات getInstance () {// system.out.println (stack.size ()) ؛ كائن كائن = فارغ ؛ إذا كان (stack.size () == 0) {// إذا كان طول المكدس الحالي 0 ، ولا يتجاوز العدد الإجمالي للكائنات الحد الأقصى المحدد إذا ((CurrentNum + poolparam.getMinobjectCount ()) <poolparam .getMaxObjectCount ()) // عدد الكائنات +1 CurrentNum ++ ؛ } آخر {synchronized (this) {try {waitme (this) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } // بعد الحصول على الإخطار ، تحقق من أن المكدس فارغ ويعطي المورد الذي تم إصداره للتو إذا (! stack.empty ()) {object = stack.pop () ؛ }}}} آخر إذا (stack.size ()> 0) {object = stack.pop () ؛ // system.out.println (stack.size ()) ؛ } كائن الإرجاع ؛ } // طريقة لإرجاع الكائن public void returnoBj (Object obj) {if (clazz.isinstance (obj)) {stack.push (obj) ؛ Synchronized (this) {detify () ؛ }} آخر {system.out.println ("هذا الكائن لا يمكن أن يدفع إلى المكدس!") ؛ }} // انتظر خوارزمية عودية private void waitme (objectpool pool) {// انتظر التحكم الفني لـ 2s if (timewait> = 2000) {system.out.println ("القفز فوق هذه الخطوة ..") ؛ timewait = 0 ؛ يعود؛ } آخر {try {pool.wait (500) ؛ // انتظر حتى يتراكم العد. . Timewait += 1000 ؛ System.out.println ("وقت الانتظار لتحرير OBJ ..") ؛ if (stack.empty ()) {system.out.println ("Agian ....") ؛ Waitme (تجمع) ؛ }} catch (interruptedException e) {E.PrintStackTrace () ؛ }}}}
إدارة دروس البلياردو ، هذا ليس صعبًا للغاية ، من الجيد مزامنتها
suppressWarnings ("Unchected") الفئة العامة ObjectPoolManage {private ObjectPoolManage () {} projectpool pool static pool ؛ // تنفيذ طريقة الحصول على Singleton ... الافتراضية العامة الثابتة المزامنة GetCacheObject (class clazz) {if (null! = pool) {return pool ؛ } آخر {createObjectPool (null ، clazz) ؛ إرجاع تجمع }} // تنفيذ طريقة الحصول على Singleton ... ObjectPool getCacheObject (poolparam p ، class clazz) {if (null! = pool) {return pool ؛ } آخر {createObjectPool (p ، clazz) ؛ إرجاع تجمع }} private static objectpool createObjectPool (poolparam p ، class clazz) {pool = new ObjectPool () ؛ if (null == p) {pool.initalpool (new poolparam (5،10) ، clazz) ؛ } آخر {pool.initalpool (p ، clazz) ؛ } تجمع الإرجاع ؛ } الفئة الثابتة الخاصة getClazz () {class clazz = null ؛ حاول {clazz = class.forname (ppp.getPropertybyName ("ObjectPath")) ؛ } catch (classNotFoundException e) {E.PrintStackTrace () ؛ } إرجاع Clazz ؛ }}
الأسئلة والتطبيقات ذات الصلة
1. يمكن أن يكون عدد الكائنات محدودًا في تجمع الكائنات. عندما يتجاوز الحد الأقصى الحد ، يحتاج تجمع الكائن إلى إرجاع استثناء أو قيمة خالية لإخطار العميل.
2. في بيئة متعددة الخيوط ، يجب مزامنة طرق الخروج والفحص.
3. تنظيف الأشياء المنتهية الصلاحية بانتظام.