“สวัสดี อามีโก้!”

"ตอนนี้ฉันจะบอกคุณเล็กน้อยเกี่ยวกับวิธีการนอน การยอมจำนน และการเข้าร่วม"

"น่าเบื่อจัง ฉันเพิ่งเจอคำถามสัมภาษณ์ว่า 'วิธี yield () sleep () และwait () ต่างกันอย่างไร' คุณช่วยอธิบายได้ไหม

"ไม่มีปัญหา อย่างแรก ทั้งสามวิธีนี้แตกต่างกันอย่างสิ้นเชิง"

1) สลีป(หมดเวลา)  – หยุดเธรดปัจจุบัน (ซึ่งเรียกว่าสลีป) เป็นจำนวนมิลลิวินาทีที่ระบุโดยพารามิเตอร์การหมดเวลา จากนั้นเธรดจะเข้าสู่สถานะ TIMED_WAITING เมธอดอาจสิ้นสุดเร็วกว่านี้หากตั้งค่าสถานะ isInterrupted

ตัวอย่าง คำอธิบาย
Thread.sleep(500);
เธรดปัจจุบันระงับการดำเนินการของตัวเองเป็นเวลา 500 มิลลิวินาที หรือ 0.5 วินาที

2) yield()  – เธรดปัจจุบัน 'ข้ามตาของมัน' เธรดเปลี่ยนจากสถานะรันเป็น สถานะ พร้อมและ JVM ดำเนินการต่อไปยังเธรดถัดไป สถานะกำลังทำงานและสถานะพร้อมเป็นสถานะย่อยของสถานะRUNNABLE

ตัวอย่าง คำอธิบาย
Thread.yield();
เธรดปัจจุบัน "ข้ามการเลี้ยว" และ Java จะสลับไปยังเธรดถัดไปทันที

3) wait(timeout)  – นี่คือเวอร์ชันของwait () method แต่มีการหมดเวลา " เมธอดการ รอสามารถเรียกได้เฉพาะภายใน บล็อก ที่ซิงโครไนซ์บนออบเจกต์ mutex ที่ล็อกโดยเธรดปัจจุบันเท่านั้น มิฉะนั้น เมธอดจะส่งข้อยกเว้น ของ Illegal MonitorState

"การเรียกเมธอดนี้จะทำให้การล็อกวัตถุ mutex ถูกปลด ทำให้เธรดอื่นสามารถรับได้ นอกจากนั้น เธรดจะเข้าสู่สถานะ WAITING (สำหรับเมธอด wait() ที่ไม่มีพารามิเตอร์) หรือสถานะ TIMED_WAITING (สำหรับการรอ (หมดเวลา ) วิธี)."

ตัวอย่าง คำอธิบาย
Object monitor = getMonitor();
synchronized(monitor)
{monitor.wait(500);}
เมื่อเมธอดการรอถูกเรียก เธรดปัจจุบันจะปลดล็อคออบเจกต์มอนิเตอร์ และพักเป็นเวลา 500 มิลลิวินาที เธรดอื่นสามารถรับวัตถุมอนิเตอร์ได้
หลังจากผ่านไป 500 มิลลิวินาที เธรดจะตื่นขึ้นและหากมอนิเตอร์ไม่ยุ่ง เธรดจะได้รับและทำงานต่อไป
หากจอภาพถูกล็อกโดยเธรดอื่น เธรดปัจจุบันจะเปลี่ยนเป็นสถานะถูกบล็อก

4) เข้าร่วม (หมดเวลา)

"วิธีนี้ไม่ได้อยู่ในคำถามของคุณ แต่อยู่ในแผนการสอนของฉัน ดังนั้นฉันจะบอกคุณเกี่ยวกับวิธีนี้ เมื่อคุณเรียกใช้เมธอด join() หรือ join(timeout) เธรดปัจจุบันจะ 'แนบ' กับเธรด ซึ่งเรียกเมธอดนี้ว่า เธรดปัจจุบันจะเข้าสู่โหมดสลีปและรอจนกว่าเธรดจะเข้าร่วมจนเสร็จสิ้น (เช่น เธรดที่มีการเรียกใช้เมธอด join())"

"เธรดปัจจุบันเข้าสู่สถานะ WAITING สำหรับเมธอด join() และสถานะ TIMED_WAITING สำหรับเมธอด join(timeout)"

ตัวอย่าง คำอธิบาย
Thread thread = getWorkThread();
thread.join(500);
เธรดปัจจุบันจะเข้าร่วมเธรด workerThread และรอให้สิ้นสุด
แต่จะ 'เลิกเข้าร่วม' หลังจาก 500 มิลลิวินาทีและทำงานต่อไป

"การหมดเวลาในเมธอด wait(timeout) และ join(timeout) หมายความว่าเมธอดจะเข้าสู่โหมดสลีปและรอบางสิ่ง แต่ไม่เกินการหมดเวลาที่กำหนดไว้ในหน่วยมิลลิวินาที จากนั้นจะตื่นขึ้น"

"ดูเหมือนว่าสิ่งเดียวที่วิธีการเหล่านี้มีเหมือนกันคือหมดเวลา พวกเขาทำในสิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิง"

"ครับ ถูกต้องครับ"