คำนำ:
การทดสอบเมื่อสัปดาห์ที่แล้วยกข้อผิดพลาดให้กับโมดูลที่พัฒนาโดยเพื่อนร่วมงานพัฒนาและยังคงเป็นเรื่องบังเอิญ
หลังจากตรวจสอบรหัสอย่างระมัดระวังฉันพบว่าการเปิดใช้งานมัลติเธรดในธุรกิจและ 2 เธรดทำงานในเวลาเดียวกัน แต่เธรดสองตัวที่เพิ่งเริ่มต้นใหม่จะต้องตรวจสอบให้แน่ใจว่าหนึ่งเสร็จสิ้นและอื่น ๆ ยังคงทำงานเพื่อกำจัดข้อผิดพลาด
ควรใช้เมื่อใด
มัลติเธรดถูกใช้ในหลาย ๆ ที่ แต่ถ้าเราต้องการเริ่มต้นเธรดอื่นหลังจากเธรดที่เฉพาะเจาะจงเสร็จสิ้น Countdownlatch สามารถมีประโยชน์ได้
ใช้อย่างไร?
มาดูรหัสมัลติเธรดทั่วไป:
แพ็คเกจรหัส; คลาสสาธารณะ MyThread ขยายเธรด {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {MyThread th = new MyThread (); เธรด t1 = เธรดใหม่ (th, "Mythread"); t1.start (); System.out.println (thread.currentthread (). getName ()); } โมฆะสาธารณะเรียกใช้ () {mythread1 th2 = ใหม่ mythread1 (); เธรด t2 = เธรดใหม่ (Th2, "Mythread1"); t2.start (); System.out.println (this.currentthread (). getName ()); } คลาส mythread1 ขยายเธรด {โมฆะสาธารณะ run () {ลอง {thread.sleep (1,000); } catch (interruptedException e) {// toDo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ E.PrintStackTrace (); } system.out.println (this.currentthread (). getName ()); -รหัสดังกล่าวข้างต้น ก่อนอื่นใช้ MyThread เพื่อสืบทอดคลาสเธรดจากนั้นเขียนคลาส Mythread1 อีกชั้นหนึ่งภายในคลาส MyThread ซึ่งสืบทอดคลาสเธรดและให้มันนอนหลับเป็นเวลา 1 วินาทีในวิธีการเรียกใช้ ด้วยวิธีนี้รหัสจะถูกพิมพ์:
จากลำดับเอาต์พุตข้างต้นเราจะเห็นว่าเธรดหลักเริ่มต้นขึ้นก่อนแล้วจึงเริ่มเธรดในตำนาน ในเธรด MyThread เธรด MyThread1 เริ่มต้นขึ้น อย่างไรก็ตามเนื่องจากเธรด MyThread1 นอนเป็นเวลา 1 วินาทีจึงจำลองการประมวลผลของธุรกิจที่ตามมาดังนั้นมันจะช้ากว่า MyThread เล็กน้อย
ตอนนี้เพิ่ม Countdownlatch ลงในรหัสและให้ MyThread1 รันก่อนจากนั้นปล่อยให้ MyThread ดำเนินการต่อไป
รหัสแพ็คเกจ; นำเข้า java.util.concurrent.countdownlatch; คลาสสาธารณะ MyThread ขยายเธรด {CountDownLatch CountdownLatch = New CountDownLatch (1); โมฆะคงที่สาธารณะหลัก (สตริง [] args) {MyThread th = new mythread (); เธรด t1 = เธรดใหม่ (th, "Mythread"); t1.start (); System.out.println (thread.currentthread (). getName ()); } โมฆะสาธารณะเรียกใช้ () {mythread1 th2 = ใหม่ mythread1 (); เธรด t2 = เธรดใหม่ (Th2, "Mythread1"); t2.start (); ลอง {countdownlatch.await (); } catch (interruptedException e) {e.printStackTrace (); } system.out.println (this.currentthread (). getName ()); } คลาส mythread1 ขยายเธรด {โมฆะสาธารณะ run () {ลอง {thread.sleep (1,000); } catch (interruptedException e) {e.printStackTrace (); } system.out.println (this.currentthread (). getName ()); countdownlatch.countdown (); -วิธีการเขียนรหัสจะแสดงด้านบนโดยแบ่งออกเป็นสามขั้นตอนโดยประมาณ
1. พารามิเตอร์วัตถุ Countdownlatch ใหม่เป็นครั้งแรกที่ตั้งไว้ที่ 1 (ฉันเข้าใจว่านี่เป็นเหมือนอาร์เรย์ใหม่เมื่อมีการล้างอาร์เรย์แล้วเธรดที่ถูกขัดจังหวะสามารถทำงานต่อไปได้)
2. การโทร Countdownlatch.await () ในคลาส Mythread; เพื่อหยุดเรียกใช้เธรดปัจจุบัน
3. เรียกเมธอด countdownlatch.countdown () ในคลาส MyThread1 เมื่อมีการดำเนินการ MYTHREAD1 ทั้งหมดและในที่สุดก็มีการเรียกวิธีการฟังก์ชั่นคือการล้าง "อาร์เรย์" ที่ฉันพูดถึง
ตรวจสอบผลลัพธ์การพิมพ์ของผลลัพธ์
ผลลัพธ์ดังแสดงในรูปด้านบนซึ่งสอดคล้องกับผลลัพธ์ที่คาดหวัง
สุดท้ายให้พูดคุยเกี่ยวกับ Countdownlatch Countdownlatch = New CountdownLatch (1) ชุดที่ 1 ในพื้นที่นี้ดังนั้นคุณต้องโทร Countdownlatch.CountDown () หนึ่งครั้งเพื่อลบ 1
หากเป็นหมายเลขอื่นจำนวนครั้งที่สอดคล้องกันจะต้องถูกเรียกมิฉะนั้นการเรียกเธรด countdownlatch.await () จะไม่ถูกเรียกใช้
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น