wait
được định nghĩa trong Object
, và không phải nó Thread
. Màn hình trên Thread
là một chút khó lường.
Mặc dù tất cả các đối tượng Java đều có màn hình, nhưng tốt hơn hết là có khóa chuyên dụng:
private final Object lock = new Object();
Bạn có thể dễ dàng hơn để đọc chẩn đoán, với chi phí bộ nhớ nhỏ (khoảng 2K mỗi quy trình) bằng cách sử dụng một lớp được đặt tên:
private static final class Lock { }
private final Object lock = new Lock();
Để wait
hoặc notify
/ notifyAll
một đối tượng, bạn cần giữ khóa với synchronized
câu lệnh. Ngoài ra, bạn sẽ cần một while
vòng lặp để kiểm tra điều kiện đánh thức (tìm một văn bản hay về luồng để giải thích tại sao).
synchronized (lock) {
while (!isWakeupNeeded()) {
lock.wait();
}
}
Thông báo:
synchronized (lock) {
makeWakeupNeeded();
lock.notifyAll();
}
Rất đáng để hiểu cả ngôn ngữ Java và các java.util.concurrent.locks
khóa (và java.util.concurrent.atomic
) khi đi vào đa luồng. Nhưng sử dụng java.util.concurrent
cấu trúc dữ liệu bất cứ khi nào bạn có thể.