waitđược định nghĩa trong Object, và không phải nó Thread. Màn hình trên Threadlà 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();
Để waithoặc notify/ notifyAllmột đối tượng, bạn cần giữ khóa với synchronizedcâu lệnh. Ngoài ra, bạn sẽ cần một whilevò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.lockskhóa (và java.util.concurrent.atomic) khi đi vào đa luồng. Nhưng sử dụng java.util.concurrentcấu trúc dữ liệu bất cứ khi nào bạn có thể.