Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Khác biệt giữa Wait và Sleep trong Java

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ém IllegalMonitorStateException.
  • sleep() không yêu cầu synchronized context.
  • Luôn dùng wait() trong vòng lặp while(condition) để tránh spurious wakeups.