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() ใช้สำหรับหน่วงเวลาการทำงานของเธรดโดยไม่ปล่อยล็อก ทั้งสองมีกรณีการใช้งานที่แตกต่างกันอย่างชัดเจน