มันสามารถแปลเป็นสลักนับถอยหลัง (นับถอยหลัง) จำเป็นต้องพูดว่าล็อคหมายถึงชื่อที่มีความหมายเพื่อป้องกันความคืบหน้า ที่นี่หมายความว่าเมธอด countdownlatch.await () จะบล็อกเธรดปัจจุบันก่อนการนับถอยหลังคือ 0
Countdownlatch เป็นคลาส Helper แบบซิงโครนัสที่อนุญาตให้หนึ่งเธรดหรือมากกว่านั้นรอจนกว่าชุดการดำเนินการที่ดำเนินการในเธรดอื่น ๆ
Countdownlatch ทำงานคล้ายกับเมธอด thread.join () และสามารถใช้สำหรับการทำงานร่วมกันระหว่างกลุ่มหนึ่งของเธรดและกลุ่มอื่น ๆ ตัวอย่างเช่นเธรดหลักต้องการชุดของการเตรียมการก่อนทำงานและเฉพาะในกรณีที่การเตรียมการทั้งหมดเหล่านี้เสร็จสมบูรณ์เธรดหลักยังคงทำงานต่อไป การเตรียมการเหล่านี้เป็นอิสระจากกันดังนั้นพวกเขาจึงสามารถดำเนินการพร้อมกันเพื่อเพิ่มความเร็ว ในสถานการณ์นี้ Countdownlatch สามารถใช้เพื่อประสานการกำหนดเวลาระหว่างเธรด ในยุคที่เธรดถูกสร้างขึ้นโดยตรง (ก่อน Java 5.0) เราสามารถใช้ Thread.oin () หลังจาก JUC ปรากฏขึ้นเนื่องจากเธรดในพูลเธรดไม่สามารถอ้างอิงได้โดยตรงต้องใช้ CountdownLatch
คลาส Countdownlatch เป็นตัวนับแบบซิงโครนัส เมื่อสร้างพารามิเตอร์ int จะถูกส่งผ่าน พารามิเตอร์นี้เป็นค่าเริ่มต้นของตัวนับ ทุกครั้งที่มีการเรียกวิธีการนับถอยหลัง () ตัวนับจะลดลง 1 และตัวนับมากกว่า 0 วิธีการรอคอย () จะบล็อกโปรแกรมและดำเนินการดำเนินการต่อ Countdownlatch ถือได้ว่าเป็นสลักนับถอยหลังซึ่งเรียกเหตุการณ์เฉพาะเมื่อการนับลดลงเป็น 0 โดยใช้คุณสมบัตินี้เธรดหลักสามารถรอการสิ้นสุดของเธรดลูก ต่อไปนี้เป็นตัวอย่างของการแข่งขันนักกีฬาจำลอง
สถานการณ์แอปพลิเคชันทั่วไปของ Countdownlatch คือ: มีงานที่ต้องการดำเนินการลง แต่คุณต้องรอจนกว่างานอื่นจะถูกดำเนินการก่อนที่คุณจะสามารถดำเนินการต่อไปได้ หากงานของเราที่เราต้องการดำเนินการต่อการเรียกใช้วิธีการรอคอย () ของวัตถุ Countdownlatch ต่อไปและงานอื่น ๆ เรียกวิธีการนับถอยหลัง () บนวัตถุ Countdownlatch เดียวกันหลังจากดำเนินงานของตัวเอง
รายการฟังก์ชัน Countdownlatch
Countdownlatch (จำนวน int) สร้าง countdownlatch เริ่มต้นด้วยการนับที่กำหนด // ทำให้เธรดปัจจุบันรอจนกว่าสลักจะนับเป็นศูนย์เว้นแต่เธรดจะถูกขัดจังหวะ Void Await () // ทำให้เธรดปัจจุบันรอจนกว่าสลักจะนับเป็นศูนย์เว้นแต่เธรดจะถูกขัดจังหวะหรือเกินเวลารอที่ระบุ บูลีนรอ (การหมดเวลานาน, หน่วยเวลา) // ลดจำนวนของสลัก หากการนับถึงศูนย์เธรดที่รอทั้งหมดจะถูกปล่อยออกมา เป็นโมฆะนับถอยหลัง () // ส่งคืนจำนวนปัจจุบัน Long getCount () // ส่งคืนสตริงที่ระบุสลักนี้และสถานะของมัน สตริง toString ()
โครงสร้างข้อมูล Countdownlatch
ไดอะแกรมคลาส UML ของ Countdownlatch มีดังนี้:
โครงสร้างข้อมูลของ Countdownlatch นั้นง่ายมันถูกนำไปใช้ผ่าน "ล็อคที่ใช้ร่วมกัน" มันมีวัตถุซิงค์ซิงค์คือประเภทการซิงค์ การซิงค์เป็นคลาสอินสแตนซ์ซึ่งสืบทอดมาจาก AQS
ตัวอย่างของ countdownlatch
ต่อไปนี้ถูกนำไปใช้ผ่าน Countdownlatch: "Main Thread" รอสำหรับ "5 เธรดเด็ก" เพื่อให้ "งานที่ระบุ (1,000ms)" ก่อนที่จะดำเนินการต่อ
นำเข้า java.util.concurrent.countdownlatch; นำเข้า java.util.concurrent.cyclicbarrier; คลาสสาธารณะ CountdownlatchTest1 {ส่วนตัวคงที่ int latch_size = 5; เอกชน countdownlatch donesignal; โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ลอง {donesignal = ใหม่ countdownlatch (latch_size); // สร้าง 5 งานใหม่สำหรับ (int i = 0; i <latch_size; i ++) ใหม่ innerThread (). เริ่มต้น (); System.out.println ("หลักรอเริ่มต้น"); // "เธรดหลัก" รอให้เสร็จ 5 งานในพูลเธรดเพื่อทำ donesignal.await (); System.out.println ("การรอคอยหลักเสร็จสิ้น"); } catch (interruptedException e) {e.printStackTrace (); }} คลาสคงที่ innerThread ขยายเธรด {public void run () {ลอง {thread.sleep (1,000); System.out.println (thread.currentthread (). getName () + "sleep 1000ms."); // ลบค่าของ countdownlatch โดย 1 donesignal.countdown (); } catch (interruptedException e) {e.printStackTrace (); - ผลการทำงาน:
การรอคอยหลักเริ่มต้น Thread-0 sleep 1000ms.thread-2 sleep 1000ms.thread-1 sleep 1000ms.thread-4 sleep 1000ms.thread-3 sleep 1000ms.main รอเสร็จ
คำอธิบายผลลัพธ์: เธรดหลักใช้ donesignal.await () เพื่อรอให้เธรดอื่นลดลง donesignal เป็น 0. อีก 5 เธรด innerThread อื่น ๆ พวกเขาแต่ละพวกเขาลบค่าของ donesignal โดย 1 ผ่าน donesignal.countdown (); เมื่อ Donesignal เป็น 0, Main จะดำเนินการต่อไปหลังจากถูกปลุก
PS: ความแตกต่างระหว่าง Countdownlatch และ Cyclicbarrier:
(1) ฟังก์ชั่นของ Countdownlatch คือการอนุญาตให้ 1 หรือ N เธรดรอให้เธรดอื่นดำเนินการเสร็จสมบูรณ์ ในขณะที่ Cyclicbarrier อนุญาตให้เธรด n รอซึ่งกันและกัน
(2) ตัวนับของ Countdownlatch ไม่สามารถรีเซ็ตได้ เคาน์เตอร์ของ Cyclicbarrier สามารถใช้หลังจากรีเซ็ตดังนั้นจึงเรียกว่าสิ่งกีดขวางที่วนรอบ