คำแนะนำ Countdownlatch สำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
Countdownlatch เป็นแพ็คเกจ Java.util.concurrent คลาสเครื่องมือซิงโครไนซ์ถัดไปที่อนุญาตให้หนึ่งเธรดหรือมากกว่านั้นรอจนกว่าชุดของการดำเนินการจะเสร็จสมบูรณ์ในเธรดอื่น
การใช้ Countdownlatch นั้นง่ายมาก ตัวอย่างต่อไปนี้เป็นสิ่งที่ฉันเห็นออนไลน์และมันก็เหมาะสมมาก ฉันจะโพสต์ที่นี่
การทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (String [] args) {CountdownLatch เริ่มต้น = ใหม่ CountdownLatch (1); countdownlatch end = new countdownlatch (2); สำหรับ (int i = 0; i <2; i ++) {เธรดเธรด = เธรดใหม่ (ผู้เล่นใหม่ (เริ่มต้น, สิ้นสุด)); thread.start (); } ลอง {system.out.println ("การแข่งขันเริ่มต้น"); เริ่มต้น. countdown (); end.await (); System.out.println ("The Race End"); } catch (exception e) {e.printstacktrace (); }}}/*** ผู้เล่น*/ผู้เล่นคลาสใช้งาน Runnable {Private CountdownLatch เริ่มต้น; สิ้นสุดการนับถอยหลังส่วนตัว; ผู้เล่น (CountDownLatch เริ่มต้น, สิ้นสุด Countdownlatch) {this.begin = เริ่มต้น; this.end = สิ้นสุด; } public void run () {ลอง {bEGIN.AWAIT (); System.out.println (thread.currentthread (). getName () + "มาถึง!") ;; end.countdown (); } catch (interruptedException e) {e.printStackTrace (); -ด้านล่างคือผลการทำงาน
คุณจะเห็นได้ว่าผ่านการใช้ Countdownlatch เราควบคุมลำดับการดำเนินการของเธรด
ในรหัสข้างต้นเราใช้วิธีการรอคอย () และวิธีการนับถอยหลัง () มาตรวจสอบฟังก์ชั่นของพวกเขากันเถอะ
ตรวจสอบวิธีการรอคอย () ก่อน แสดงความคิดเห็น The End.await () ในวิธีการหลัก ต่อไปนี้เป็นผลการดำเนินการหลังจากแสดงความคิดเห็น
คุณจะเห็นว่าเธรดหลักไม่ได้รอให้กระทู้ที่เป็นตัวแทนของผู้เข้าแข่งขันจะจบลงและประกาศโดยตรงว่าการแข่งขันสิ้นสุดลง! เกมที่จบลงที่จุดเริ่มต้น ---
จะเห็นได้ที่นี่ว่า วิธีการรอ () มีเอฟเฟกต์การบล็อก
ประการที่สองมาตรวจสอบวิธีการนับถอยหลังและแสดงความคิดเห็นในตอนท้าย. countdown () ในเธรดของผู้เข้าแข่งขัน ต่อไปนี้เป็นผลการทำงาน
โปรแกรมทำงานแล้วและผู้เล่นทุกคนได้มาถึงเส้นชัย แต่ผู้ตัดสินก็ไม่ได้ส่งเสริมการสิ้นสุดของเกม เขารออะไรอยู่?
เราเดาว่าวิธีการนับถอยหลัง () มีผลในการตื่นขึ้นมาด้ายบล็อก
จากนั้นเราอาจถามเพราะมันมีฟังก์ชั่นในการปลุกเธรดการปิดกั้นจึงเป็นไปไม่ได้ที่จะปลุกเธรดหลักที่ถูกบล็อกหากเราเรียกเมธอด Countdown () เพียงครั้งเดียวเท่านั้น?
ลองกันดูการแสดงความคิดเห็นเกี่ยวกับ Coutdown () สร้างผู้เล่นอีกครั้งรหัสมีดังนี้
Class Player2 ใช้งาน Runnable {Private Countdownlatch เริ่มต้น; สิ้นสุดการนับถอยหลังส่วนตัว; Player2 (Countdownlatch เริ่มต้น, countdownlatch end) {this.begin = เริ่มต้น; this.end = สิ้นสุด; } public void run () {ลอง {bEGIN.AWAIT (); System.out.println (thread.currentthread (). getName () + "มาถึง!"); // end.countdown (); } catch (interruptedException e) {e.printStackTrace (); -วิธีการหลักยังได้รับการแก้ไขดังนี้การสร้างผู้เล่นสองคนที่แตกต่างกัน
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {countdownlatch เริ่มต้น = new countdownlatch (1); countdownlatch end = new countdownlatch (2); เธรดเธรด = เธรดใหม่ (ผู้เล่นใหม่ (เริ่มต้นจบ)); thread.start (); เธรดเธรด 2 = เธรดใหม่ (Player22 (เริ่มต้นจบ)); Thread2.start (); ลอง {system.out.println ("การแข่งขันเริ่มต้น"); เริ่มต้น. countdown (); end.await (); System.out.println ("The Race End"); } catch (exception e) {e.printstacktrace (); -เรียกใช้นี่คือผลลัพธ์
โปรแกรมหลักได้รับการบล็อกและไม่ได้ถูกปลุก ผู้ตัดสินใช้ห้องน้ำมาระยะหนึ่งแล้ว!
ดูเหมือนว่าการนับถอยหลัง () ไม่ได้ปลุกเธรดโดยตรงมันเป็นเหมือนตัวนับนับถอยหลัง
ตรวจสอบเอกสาร API แน่นอนเราได้เพิ่มพารามิเตอร์ 2 ลงในตัวสร้างและเราจำเป็นต้องโทรนับถอยหลัง () 2 ครั้งเพื่อปลุกเธรดที่ถูกบล็อกของ end.await ()
countdownlatch end = new countdownlatch (2);
เพื่อสรุป
1. countdownlatch end = new countdownlatch (n); // เมื่อสร้างวัตถุคุณต้องส่งผ่านพารามิเตอร์ N
2. end.await () สามารถบล็อกเธรดได้จนกว่าจะถึงจุดสิ้นสุด. countdown () เรียกว่า n ครั้งก่อนที่จะปล่อยเธรด
3. end.countdown () สามารถเรียกได้ในหลายเธรดเพื่อคำนวณจำนวนการโทรที่เป็นผลรวมของเธรดทั้งหมด
ในบล็อกถัดไปฉันจะอธิบายว่า Countdownlatch ทำงานอย่างไรจากระดับซอร์สโค้ด
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น