CodeGym /หลักสูตร /Java มัลติเธรด /เมธอดอื่นๆ ของคลาสเธรด (sleep, yield…)

เมธอดอื่นๆ ของคลาสเธรด (sleep, yield…)

Java มัลติเธรด
ระดับ, บทเรียน
มีอยู่

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

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

"น่าเบื่อจัง ฉันเพิ่งเจอคำถามสัมภาษณ์ว่า 'วิธี 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) หมายความว่าเมธอดจะเข้าสู่โหมดสลีปและรอบางสิ่ง แต่ไม่เกินการหมดเวลาที่กำหนดไว้ในหน่วยมิลลิวินาที จากนั้นจะตื่นขึ้น"

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

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

ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION