wait() - Thread giải phóng quyền sở hữu monitor (khóa) và chờ cho đến khi thread khác gọi notify() hoặc notifyAll() trên cùng đối tượng. Thread sau đó chờ tái chiếm khóa và tiếp tục thực thi.
sleep() - Làm thread hiện tại ngủ (tạm dừng thực thi) trong số mili-giây chỉ định. Thread không mất quyền sở hữu bất kỳ monitor nào. Nó đưa thread vào trạng thái "Not Runnable" trong một khoảng thời gian xác định.
Bảng so sánh chi tiết
| STT | Tiêu chí | wait() | sleep() |
|---|---|---|---|
| 1 | Thuộc class | Object class |
Thread class |
| 2 | Giải phóng khóa | Giải phóng khóa trên đối tượng | Không giải phóng khóa |
| 3 | Bối cảnh gọi | Gọi trên đối tượng (bên trong synchronized block) | Gọi trên thread (Thread.sleep()) |
| 4 | Điều kiện thức dậy | Khi có notify()/notifyAll() từ đối tượng |
Hết thời gian hoặc bị interrupt() |
| 5 | Spurious wakeups (thức dậy giả) | Có thể xảy ra (nên dùng trong vòng lặp while) | Không xảy ra |
Ví dụ minh họa
synchronized(lockedObject) {
while (condition == true) {
lockedObject.wait(); // Giải phóng khóa lockedObject
}
Thread.sleep(100); // Thread ngủ 100ms, GIỮ khóa
}
Lưu ý quan trọng
wait()bắt buộc được gọi bên trong synchronized block/method,否则 némIllegalMonitorStateException.sleep()không yêu cầu synchronized context.- Luôn dùng
wait()trong vòng lặpwhile(condition)để tránh spurious wakeups.