การใช้งานการเขียนโปรแกรมพร้อมกันของ Java
1. คลาสพื้นฐานของแคชที่มีขอบเขต
แพ็คเกจ cn.xf.cp.ch14;/** * ฟังก์ชั่น: แคชที่ถูกผูกไว้ใช้คลาสฐาน * เวลา: 2:20:00 PM * ไฟล์: ไฟล์: baseBoundededBuffer.java * @ผู้ดูแลระบบ * * @param <v> */คลาสสาธารณะ หางส่วนตัว หัว int ส่วนตัว; จำนวน int ส่วนตัว; ฐานสาธารณะ baseboundedBuffer (ความจุ int) {// เริ่มต้นอาร์เรย์ this.buf = (v []) วัตถุใหม่ [ความจุ]; } // ใส่ในข้อมูลวิธีสุดท้ายไม่สามารถเขียนใหม่ได้รับการป้องกันการซิงโครไนซ์สุดท้าย doput (v V) {buf [tail] = V; if (++ tail == buf.length) {tail = 0; } // แทรกเมธอดจำนวนเงินทั้งหมด ++ ++ จำนวน; } / *** นำข้อมูล* @return* / ป้องกันการซิงโครไนซ์สุดท้าย v Dotake () {v v = buf [head]; buf [head] = null; if (++ head == buf.length) {head = 0; } --นับ; กลับ V; } // โดยการตัดสินการนับพิจารณาว่าอาร์เรย์เป็นบูลีนสุดท้ายที่ซิงโครไนซ์สาธารณะเต็มรูปแบบ isfull () {count return == buf.length; } บูลีนสุดท้ายที่ซิงโครไนซ์สาธารณะ isempty () {count return == 0; -2. กำหนดข้อกำหนดเบื้องต้นก่อนดำเนินการ
แพ็คเกจ cn.xf.cp.ch14;/*** ฟังก์ชั่น: ตรวจสอบการแทรกและรับการดำเนินการองค์ประกอบก่อนจากนั้นทำการดำเนินการ การตรวจสอบไม่ผ่านและจะไม่ได้รับอนุญาตให้ใช้งาน * เวลา: 2:33:41 PM * ไฟล์: GrumpyBoundedBuffer.java * @ผู้ดูแลระบบ * * @param <v> */คลาสสาธารณะ Grumpyboundededbuffer <v> ขยายขนาด baseboundedbuffer <v> } โมฆะที่ซิงโครไนซ์สาธารณะ Put (V V) โยนข้อยกเว้น {// ถ้าเป็นคิวเต็มรูปแบบองค์ประกอบใหม่ไม่สามารถแทรกได้ถ้า (this.isfull ()) {โยนข้อยกเว้นใหม่ ("qule เกิน"); } this.doput (v); } // ในทำนองเดียวกันถ้าคิวว่างเปล่าองค์ประกอบใหม่ไม่สามารถเรียกคืนสาธารณะได้ที่ซิงโครไนซ์ v ใช้ () โยนข้อยกเว้น {ถ้า (this.isempty ()) {โยนข้อยกเว้นใหม่ ("ไม่มีองค์ประกอบในคิว"); } return this.dotake (); -3. บรรลุการปิดกั้นอย่างง่ายผ่านการสำรวจและการนอนหลับ
แพ็คเกจ cn.xf.cp.ch14;/** *ฟังก์ชั่น: ใช้การบล็อกอย่างง่ายผ่านการสำรวจและการจำศีล *เวลา: 2:55:54 PM *ไฟล์: SleepyBoundedBuffer.java * @ผู้ดูแลระบบ * * @พาร์มา <v> */ชั้นเรียนสาธารณะ 2000; Public SleepyBoundedBuffer (ความจุ int) {super (ความจุ); } // เมื่อใส่ในคิวสาธารณะโมฆะใส่ (v v) พ่น InterruptedException {ในขณะที่ (จริง) {// ลูปไม่ได้ล็อคที่นี่มิฉะนั้นการล็อคจะไม่ถูกปล่อยออกมา หากการจำศีลไม่ได้ล็อคการนอนหลับจะถูกล็อคและคนอื่นไม่สามารถทำงานได้ในระหว่างการจำศีล เป็นไปไม่ได้ที่องค์ประกอบจะออกซิงโครไนซ์ (นี่) {// ถ้าคิวไม่เต็มแล้วใส่องค์ประกอบถ้า (! this.isfull ()) {this.doput (v); กลับ; }} // มิฉะนั้นการนอนหลับและออกจาก CPU เพื่อครอบครอง Thread.sleep (sleep_granularity); }} สาธารณะ V Take () พ่น InterruptedException {ในขณะที่ (จริง) {// ลูปไม่ได้ล็อคที่นี่มิฉะนั้นการล็อคจะไม่ถูกปล่อยออกมา หากการนอนหลับไม่ล็อคการนอนหลับจะถูกล็อคและคนอื่นไม่สามารถทำงานได้เมื่อนอนหลับ จะไม่มีองค์ประกอบใหม่เข้ามาในการซิงโครไนซ์ (นี้) {// ถ้าส่วนอาร์เรย์ว่างเปล่าข้อมูลสามารถเรียกคืนได้หาก (! this.isempty ()) {ส่งคืนสิ่งนี้ dotake (); } // ถ้าคิวว่างเปล่าลองนอนอีกไม่กี่วินาทีอีกครั้ง} thread.sleep (sleep_granularity); -4. คิวแบบมีเงื่อนไข
แพ็คเกจ cn.xf.cp.ch14;/** * ฟังก์ชั่น: ใช้คิวเงื่อนไข * เวลา: 3:32:04 PM * ไฟล์: BoundedBuffer.java * @ผู้ดูแลระบบ * * @param <v> */คลาสสาธารณะ BoundedBuffer <v> } /** * ใส่องค์ประกอบข้อมูล * @param v * @throws interruptedException * /โมฆะที่ซิงโครไนซ์สาธารณะใส่ (V V) พ่น InterruptedException {ในขณะที่ (this.isfull ()) {// ระงับโปรแกรมที่นี่ } // หากคิวไม่เต็มโปรแกรมจะถูกปลุกขึ้นมาและการล็อคจะกลับมาอีกครั้ง doput (v); // การดำเนินการสิ้นสุดลงและปลุกคิวอื่น ๆ this.notifyall (); } public synchronized v ใช้ () พ่น InterruptedException {ในขณะที่ (this.isEmpty ()) {this.wait (); } v v = this.dotake (); this.notifyall (); กลับ V; -ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!