คำนิยาม
พูลวัตถุเป็นชุดของวัตถุที่ได้รับการเริ่มต้นและใช้งานได้ ผู้ใช้พูลสามารถรับวัตถุจากสระว่ายน้ำทำงานกับพวกเขาและส่งกลับไปยังสระว่ายน้ำแทนที่จะทำลายมันถ้าไม่
หากการเริ่มต้นและอินสแตนซ์มีราคาแพงและมีความจำเป็นที่จะต้องมีอินสแตนซ์บ่อยครั้ง แต่จำนวนของอินสแตนซ์มีขนาดเล็กในแต่ละครั้งการปรับปรุงประสิทธิภาพที่สำคัญสามารถทำได้โดยใช้พูลวัตถุ เวลาในการรับวัตถุจากสระว่ายน้ำสามารถคาดเดาได้ แต่เวลาที่ใช้ในการสร้างอินสแตนซ์ใหม่ไม่แน่นอน
ทำให้สำเร็จ
1. นำกลับมาใช้ใหม่ - วัตถุในพูลวัตถุโดยปกติค่าใช้จ่ายในการสร้างอินสแตนซ์ค่อนข้างสูง
2. ไคลเอนต์ - ใช้อินสแตนซ์ของวัตถุ
3. ReusablePool - จัดการอินสแตนซ์การรีไซเคิลและการทำลายวัตถุ
แนวคิดหลักในตัวอย่างเดียว
1. สแต็คนี่คือสแต็ก
2. วิธีการเริ่มต้นคุณสามารถสร้างพูลล่วงหน้าได้เมื่อเปิดคอนเทนเนอร์
3. วิธีการสร้างอินสแตนซ์
4. จัดเตรียมวิธีการรับอินสแตนซ์วัตถุจากพูล
5. ให้วิธีการส่งคืน แต่ผลที่ตามมานั้นร้ายแรง
6. วิธีการควบคุมเวลารอคำขอ หลังจากเหตุการณ์บางอย่างผ่านไปแล้วตัวชี้โมฆะจะถูกส่งกลับ
นำเข้า java.util.stack; @suppresswarnings ("ไม่ได้ตรวจสอบ") คลาสสาธารณะ ObjectPool {Public ObjectPool () {} Private Poolparam Poolparam; โมฆะสาธารณะ SetPoolparam (Poolparam Poolparam) {this.poolparam = poolparam; } // จำนวนทั้งหมดของวัตถุในปัจจุบัน int int currentNum = 0; Class Class Private; โมฆะสาธารณะ setClazz (คลาส Clazz) {this.clazz = clazz; } // สแต็กใช้ในการจัดเก็บวัตถุและจำลองสแต็คสแต็คส่วนตัวสระว่ายน้ำ สแต็คสาธารณะ getStack () {return stack; } โมฆะสาธารณะ setStack (สแต็กสแต็ก) {this.stack = stack; } // ...................................................................... // รอการหมดเวลาเพื่อหมดอายุ int ช่วงเวลาส่วนตัว = 0; // ............................................................................ // สร้างวัตถุพูลวัตถุสาธารณะช่องว่างสาธารณะ (Poolparam Poolparam, Class Clazz) {this.set.setPoolparam (Poolparam); this.setclazz (clazz); stack = new Stack (); stack.clear (); // system.out.println ("obj..Pool เป็นค่าเริ่มต้น ... "); // สร้างจำนวนวัตถุขั้นต่ำที่จะกำหนดค่าและกดลงในสแต็กลอง {สำหรับ (int i = 0; i <poolparam.getMinobjectCount (); i ++) {// เริ่มต้นพูลวัตถุ }} catch (InstantiationException E) {E.printStackTrace (); } catch (unglegalAccessException e) {e.printStackTrace (); }} // สร้างวัตถุส่วนตัววัตถุเดียว createObj (คลาส clazz) {object obj = null; ลอง {obj = clazz.newinstance (); // system.out.println ("ใหม่ ... "); } catch (InstantiationException E) {E.printStackTrace (); } catch (unglegalAccessException e) {e.printStackTrace (); } return obj; } // รับเมธอดที่จัดทำโดยวัตถุพูลวัตถุสาธารณะ getInstance () {// system.out.println (stack.size ()); วัตถุวัตถุ = null; if (stack.size () == 0) {// ถ้าความยาวของสแต็กปัจจุบันคือ 0 และจำนวนวัตถุทั้งหมดไม่เกินจำนวนที่กำหนดสูงสุดถ้า ((currentnum + poolparam.getMinObjectCount () <poolparam .getMaxObjectCount () {// สร้างวัตถุใหม่ // จำนวนวัตถุ +1 currentNum ++; } else {ซิงโครไนซ์ (นี่) {ลอง {waitme (นี่); } catch (exception e) {e.printstacktrace (); } // หลังจากได้รับการแจ้งเตือนให้ตรวจสอบว่าสแต็กว่างเปล่าและให้ทรัพยากรที่เพิ่งเปิดตัวหาก (! stack.empty ()) {object = stack.pop (); }}}} อื่นถ้า (stack.size ()> 0) {object = stack.pop (); // system.out.println (stack.size ()); } return object; } // วิธีการส่งคืนโมฆะสาธารณะโมฆะ returnobj (Object obj) {ถ้า (clazz.isinstance (obj)) {stack.push (obj); ซิงโครไนซ์ (นี้) {แจ้ง (); }} else {system.out.println ("วัตถุนี้ไม่สามารถผลักดันไปยังสแต็ก!"); }} // รออัลกอริทึมซ้ำโมฆะส่วนตัว Waitme (ObjectPool Pool) {// รอการควบคุมทางเทคนิคของ 2S ถ้า (timeWait> = 2000) {System.out.println ("กระโดดขึ้นขั้นตอนนี้ .. "); timewait = 0; กลับ; } else {ลอง {pool.wait (500); // รอการนับเพื่อสะสม - Timewait += 1,000; System.out.println ("เวลารอเพื่อปลดปล่อย obj .. "); if (stack.empty ()) {system.out.println ("agian .... "); waitme (พูล); }} catch (interruptedException e) {e.printStackTrace (); -
จัดการชั้นเรียนพูลนี่ไม่ใช่เรื่องยากมันเป็นการดีที่จะซิงโครไนซ์
@suppresswarnings ("ไม่ได้ตรวจสอบ") คลาสสาธารณะคลาส ObjectPoolManage {Private ObjectPoolManage () {} พูล ObjectPool แบบคงที่ส่วนตัว; // ใช้วิธีการที่ได้รับของ Singleton ... ค่าเริ่มต้นสาธารณะแบบคงที่แบบคงที่แบบคงที่ objectPool getCacheObject (คลาส Class) {ถ้า (null! = พูล) {return pool; } else {createObjectPool (null, clazz); สระว่ายน้ำกลับ; }} // ใช้วิธีการที่ได้รับของ Singleton ... ObjectPool แบบซิงโครไนซ์แบบสแตติกแบบสแตติกแบบสแตติกที่กำหนดเอง GetCacheObject (PoolParam P, Class Clazz) {ถ้า (NULL! = Pool) {Return Pool; } else {createObjectPool (p, clazz); สระว่ายน้ำกลับ; }} 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; ลอง {clazz = class.forName (ppp.getPropertyByName ("ObjectPath")); } catch (classnotFoundException e) {e.printStackTrace (); } ส่งคืน Clazz; -
คำถามและการใช้งานที่เกี่ยวข้อง
1. จำนวนวัตถุสามารถ จำกัด ในพูลวัตถุ เมื่อขีด จำกัด เกินขีด จำกัด พูลวัตถุจะต้องส่งคืนข้อยกเว้นหรือค่าว่างเพื่อแจ้งลูกค้า
2. ในสภาพแวดล้อมแบบมัลติเธรดวิธีการชำระเงินและการตรวจสอบจะต้องซิงโครไนซ์
3. ทำความสะอาดวัตถุที่หมดอายุเป็นประจำ