สมมติว่ามีสองเธรดที่ทำงานพร้อมกันและรหัสที่ดำเนินการโดยเธรดหนึ่งมีลูปตายเช่น: ในขณะที่ (จริง) ... เมื่อเธรดดำเนินการรหัสในขณะที่ (จริง) เธรดอื่นจะมีโอกาสดำเนินการหรือไม่?
รหัสตัวอย่าง (รหัสมีต้นกำเนิดจากอินเทอร์เน็ต)
บริการคลาสสาธารณะ {Object Object1 = New Object (); โมฆะสาธารณะ Methoda () {ซิงโครไนซ์ (Object1) {system.out.println ("methoda start"); บูลีน iscontinuerun = true; // ดำเนินการวนซ้ำที่นี่ในขณะที่ (iScontinuerun) {} system.out.println ("methoda end"); }} Object Object2 = วัตถุใหม่ (); โมฆะสาธารณะ MethodB () {ซิงโครไนซ์ (Object2) {System.out.println ("MethodB เริ่มต้น"); System.out.println ("methodb end"); - การใช้งานคลาสเธรดทั้งสองมีดังนี้:
Import Service.service; Threada คลาสสาธารณะขยายเธรด {บริการส่วนตัว; Threada สาธารณะ (บริการบริการ) {super (); this.service = บริการ; } @Override โมฆะสาธารณะ Run () {service.methoda (); - เธรด A Execute Methoda () และมีห่วงที่ตายแล้วใน Methoda ()
Import Service.service; ThreadB ระดับสาธารณะขยายเธรด {บริการส่วนตัว; Threadb สาธารณะ (บริการบริการ) {super (); this.service = บริการ; } @Override โมฆะสาธารณะ Run () {service.methodb (); -เธรด B เรียกใช้ MethodB () เมื่อเธรด A เข้าสู่ขณะที่ Dead Loop ใน Methoda () เธรด B สามารถดำเนินการและเสร็จสมบูรณ์ได้หรือไม่?
ชั้นเรียนทดสอบ
Import Service.service; นำเข้า extthread.threada; นำเข้า extthread.threadb; คลาสสาธารณะรัน {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {บริการบริการ = บริการใหม่ (); threada athread = threada ใหม่ (บริการ); athread.start (); Threadb bthread = threadb ใหม่ (บริการ); bthread.start (); -เนื่องจากล็อควัตถุที่ได้รับจากเธรด A และ Thread B นั้นไม่ได้เป็นล็อคเดียวกันจึงสามารถเห็นได้จากผลลัพธ์ที่เธรด B สามารถดำเนินการและเสร็จสมบูรณ์ได้ เนื่องจากเธรด A เข้าสู่ขณะที่ Dead Loop, Thread A ยังคงดำเนินการและเรียกใช้ (โปรแกรมทั้งหมดยังไม่สิ้นสุด) แต่เธรด B จะสิ้นสุดลง
นั่นคือแม้ว่าเธรด A จะดำเนินการอยู่เสมอ แต่ก็ต้องใช้ CPU อย่างไรก็ตามการกำหนดเวลาเธรดเป็นความรับผิดชอบของ JVM หรือระบบปฏิบัติการ ไม่ได้หมายความว่าเธรด A จะวนซ้ำอย่างต่อเนื่องในขณะที่เธรด B จะไม่ครอบครอง CPU สำหรับเธรด A มันเทียบเท่ากับงาน "การคำนวณที่เข้มข้น" หากในขณะที่วนรอบการทดสอบอย่างต่อเนื่องว่าเงื่อนไขบางอย่างเป็นจริงหรือไม่วิธีนี้เป็นการเสีย CPU คุณสามารถอ้างถึงตัวอย่างที่เฉพาะเจาะจง: "วิธีการสื่อสารระหว่างเธรด" ในวิธีการสื่อสารระหว่างเธรดของ Java Multi-Threaded Java Point ของ "วิธีการสื่อสารระหว่างเธรด" จุดที่สองขณะสำรวจ
หาก Service.java ได้รับการแก้ไขดังนี้:
บริการคลาสสาธารณะ {// Object Object1 = New Object (); โมฆะสาธารณะ Methoda () {ซิงโครไนซ์ (นี่) {system.out.println ("methoda start"); บูลีน iscontinuerun = true; // ดำเนินการวนซ้ำที่นี่ในขณะที่ (iScontinuerun) {} system.out.println ("methoda end"); }} // Object Object2 = วัตถุใหม่ (); โมฆะสาธารณะ MethodB () {ซิงโครไนซ์ (นี่) {System.out.println ("MethodB เริ่มต้น"); System.out.println ("methodb end"); -หากเธรด A ได้รับการล็อควัตถุก่อนเธรด A จะอยู่ในขณะที่วนรอบเนื่องจากลูปในขณะที่ เธรด B ไม่สามารถเรียกใช้ MethodB () เพราะไม่สามารถรับล็อคได้
จะเห็นได้ว่าหากเธรดหนึ่งไม่สามารถออกจากวิธีการซิงโครไนซ์และไม่สามารถปล่อยล็อคได้เธรดอื่น ๆ สามารถรอได้อย่างไม่สิ้นสุด
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์สำหรับทุกคนในการเรียนรู้การมัลติเธรด Java