Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ความแตกต่างระหว่าง Wait และ Sleep ใน Java

wait() - เธรดจะปล่อยการเป็นเจ้าของมอนิเตอร์ (monitor) และรอจนกว่าเธรดอื่นจะแจ้งเตือนผ่าน notify() หรือ notifyAll() จากนั้นเธรดจะรอจนกว่าจะได้การเป็นเจ้าของมอนิเตอร์กลับมาและดำเนินการต่อ

sleep() - เมธอดนี้ทำให้เธรดที่กำลังทำงานอยู่หยุดนิ่ง (cease execution) ชั่วคราวเป็นจำนวนมิลลิวินาทีที่ระบุ เธรด ไม่สูญเสีย การเป็นเจ้าของมอนิเตอร์ใดๆ ส่งเธรดปัจจุบันเข้าสู่สถานะ "Not Runnable" เป็นเวลาที่กำหนด

ตารางเปรียบเทียบรายละเอียด

ลำดับ หัวข้อ wait() sleep()
1 คลาส เมธอด wait() เป็นของคลาส Object เมธอด sleep() เป็นของคลาส Thread
2 การปล่อยล็อก wait() ปล่อยล็อกของอ็อบเจ็กต์ ไม่ปล่อยล็อกของอ็อบเจ็กต์
3 บริบทการเรียกใช้ เรียกใช้ได้บนอ็อบเจ็กต์โดยตรง เรียกใช้ได้บนเธรด
4 เงื่อนไขการปลุก จนกว่าจะมีการเรียก notify() หรือ notifyAll() จากอ็อบเจ็กต์ จนกว่าเวลาจะหมด หรือมีการเรียก interrupt()
5 Spurious Wakeups อาจเกิด spurious wakeups (ปลุกตัวเองโดยไม่มีการแจ้งเตือน) ไม่เกิด spurious wakeups

ตัวอย่างการใช้งานร่วมกัน

synchronized(lockedObject) {
    while(condition == true) {
        lockedObject.wait(); // ปล่อยล็อก lockedObject
    }
    Thread.sleep(100); // ให้เธรดปัจจุบัน sleep
}

สรุป

wait() ใช้สำหรับการสื่อสารระหว่างเธรด (inter-thread communication) และต้องอยู่ในบล็อก synchronized ส่วน sleep() ใช้สำหรับหน่วงเวลาการทำงานของเธรดโดยไม่ปล่อยล็อก ทั้งสองมีกรณีการใช้งานที่แตกต่างกันอย่างชัดเจน