“สวัสดี อามีโก้!”
"ตอนนี้ฉันจะบอกคุณเล็กน้อยเกี่ยวกับวิธีการนอน การยอมจำนน และการเข้าร่วม"
"น่าเบื่อจัง ฉันเพิ่งเจอคำถามสัมภาษณ์ว่า 'วิธี yield () sleep () และwait () ต่างกันอย่างไร' คุณช่วยอธิบายได้ไหม
"ไม่มีปัญหา อย่างแรก ทั้งสามวิธีนี้แตกต่างกันอย่างสิ้นเชิง"
1) สลีป(หมดเวลา) – หยุดเธรดปัจจุบัน (ซึ่งเรียกว่าสลีป) เป็นจำนวนมิลลิวินาทีที่ระบุโดยพารามิเตอร์การหมดเวลา จากนั้นเธรดจะเข้าสู่สถานะ TIMED_WAITING เมธอดอาจสิ้นสุดเร็วกว่านี้หากตั้งค่าสถานะ isInterrupted
ตัวอย่าง | คำอธิบาย |
---|---|
|
เธรดปัจจุบันระงับการดำเนินการของตัวเองเป็นเวลา 500 มิลลิวินาที หรือ 0.5 วินาที |
2) yield() – เธรดปัจจุบัน 'ข้ามตาของมัน' เธรดเปลี่ยนจากสถานะรันเป็น สถานะ พร้อมและ JVM ดำเนินการต่อไปยังเธรดถัดไป สถานะกำลังทำงานและสถานะพร้อมเป็นสถานะย่อยของสถานะRUNNABLE
ตัวอย่าง | คำอธิบาย |
---|---|
|
เธรดปัจจุบัน "ข้ามการเลี้ยว" และ Java จะสลับไปยังเธรดถัดไปทันที |
3) wait(timeout) – นี่คือเวอร์ชันของwait () method แต่มีการหมดเวลา " เมธอดการ รอสามารถเรียกได้เฉพาะภายใน บล็อก ที่ซิงโครไนซ์บนออบเจกต์ mutex ที่ล็อกโดยเธรดปัจจุบันเท่านั้น มิฉะนั้น เมธอดจะส่งข้อยกเว้น ของ Illegal MonitorState
"การเรียกเมธอดนี้จะทำให้การล็อกวัตถุ mutex ถูกปลด ทำให้เธรดอื่นสามารถรับได้ นอกจากนั้น เธรดจะเข้าสู่สถานะ WAITING (สำหรับเมธอด wait() ที่ไม่มีพารามิเตอร์) หรือสถานะ TIMED_WAITING (สำหรับการรอ (หมดเวลา ) วิธี)."
ตัวอย่าง | คำอธิบาย |
---|---|
|
เมื่อเมธอดการรอถูกเรียก เธรดปัจจุบันจะปลดล็อคออบเจกต์มอนิเตอร์ และพักเป็นเวลา 500 มิลลิวินาที เธรดอื่นสามารถรับวัตถุมอนิเตอร์ได้ หลังจากผ่านไป 500 มิลลิวินาที เธรดจะตื่นขึ้นและหากมอนิเตอร์ไม่ยุ่ง เธรดจะได้รับและทำงานต่อไป หากจอภาพถูกล็อกโดยเธรดอื่น เธรดปัจจุบันจะเปลี่ยนเป็นสถานะถูกบล็อก |
4) เข้าร่วม (หมดเวลา)
"วิธีนี้ไม่ได้อยู่ในคำถามของคุณ แต่อยู่ในแผนการสอนของฉัน ดังนั้นฉันจะบอกคุณเกี่ยวกับวิธีนี้ เมื่อคุณเรียกใช้เมธอด join() หรือ join(timeout) เธรดปัจจุบันจะ 'แนบ' กับเธรด ซึ่งเรียกเมธอดนี้ว่า เธรดปัจจุบันจะเข้าสู่โหมดสลีปและรอจนกว่าเธรดจะเข้าร่วมจนเสร็จสิ้น (เช่น เธรดที่มีการเรียกใช้เมธอด join())"
"เธรดปัจจุบันเข้าสู่สถานะ WAITING สำหรับเมธอด join() และสถานะ TIMED_WAITING สำหรับเมธอด join(timeout)"
ตัวอย่าง | คำอธิบาย |
---|---|
|
เธรดปัจจุบันจะเข้าร่วมเธรด workerThread และรอให้สิ้นสุด แต่จะ 'เลิกเข้าร่วม' หลังจาก 500 มิลลิวินาทีและทำงานต่อไป |
"การหมดเวลาในเมธอด wait(timeout) และ join(timeout) หมายความว่าเมธอดจะเข้าสู่โหมดสลีปและรอบางสิ่ง แต่ไม่เกินการหมดเวลาที่กำหนดไว้ในหน่วยมิลลิวินาที จากนั้นจะตื่นขึ้น"
"ดูเหมือนว่าสิ่งเดียวที่วิธีการเหล่านี้มีเหมือนกันคือหมดเวลา พวกเขาทำในสิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิง"
"ครับ ถูกต้องครับ"
GO TO FULL VERSION