Trong Java, wait()
và notify()
là phần của cơ chế chờ/đánh thức cho multithreading, giúp các thread giao tiếp với nhau về trạng thái của các tài nguyên mà chúng đang chờ đợi hoặc làm việc với. Cả hai phương thức này đều được sử dụng trong context của đồng bộ hóa (synchronization) và phải được gọi từ trong một khối synchronized
.
wait()
Phương thức wait()
khiến thread hiện tại chờ đợi cho đến khi một thread khác gọi notify()
hoặc notifyAll()
trên cùng một đối tượng. Khi wait()
được gọi, thread hiện tại sẽ giải phóng khóa của đối tượng và chờ đợi.
notify() và notifyAll()
notify()
: Đánh thức một thread đang chờ đợi trên đối tượng này (đối tượng được sử dụng làm khóa trong khốisynchronized
). Nếu có nhiều thread đang chờ, một trong số chúng sẽ được chọn để đánh thức một cách ngẫu nhiên.notifyAll()
: Đánh thức tất cả các thread đang chờ đợi trên đối tượng này.
Cách sử dụng
class SharedResource {
public synchronized void doWait() {
try {
while (<condition is not met>) {
wait(); // Thread chờ đợi
}
// Tiếp tục thực hiện khi điều kiện được đáp ứng
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // set the interrupt flag
}
}
public synchronized void doNotify() {
// Thay đổi điều kiện khiến thread đang chờ đợi có thể tiếp tục
// ...
notify(); // Hoặc notifyAll(), tùy thuộc vào tình huống
}
}
Lưu ý:
- Cả
wait()
,notify()
, vànotifyAll()
đều phải được gọi trong một khốisynchronized
để đảm bảo tính toàn vẹn của dữ liệu mà các thread chia sẻ và truy cập. - Luôn sử dụng
wait()
trong một vòng lặp kiểm tra điều kiện (while
) để tránh "spurious wakeups" (tức là thread được đánh thức mà không có notify). - Chọn giữa
notify()
vànotifyAll()
tùy thuộc vào logic ứng dụng và tài nguyên mà các thread đang chờ đợi. Sử dụngnotifyAll()
khi bạn cần đánh thức nhiều thread đang chờ đợi trên cùng một điều kiện và chỉ có thể tiếp tục khi điều kiện đó thay đổi.
wait()
và notify()
là công cụ quan trọng trong việc xây dựng ứng dụng đa luồng hiệu quả, cho phép các thread phối hợp làm việc một cách linh hoạt và an toàn.
Comments