我想知道例如r.wait()的作品?有了這個代碼:如何通過notify/wait()喚醒/暫停特定(一組)線程?
public class Buffer1<T> {
private T content;
private boolean empty;
private Object r = new Object();
private Object w = new Object();
public Buffer1() {
empty = true; }
public Buffer1(T content) {
this.content = content;
empty = false; }
public T take() throws InterruptedException {
synchronized (r) {
while (empty) {
r.wait();
}
synchronized (w) {
empty = true;
w.notify();
return content;
}
}
}
public void put(T o) throws InterruptedException {
synchronized(w) {
while (!empty) {
w.wait();
}
synchronized (r) {
empty = false;
r.notify();
content = o;
}
如何r.wait(),w.wait(),r.notify(),w.notify()工作?它們如何與同步(r)/同步(w)一起工作?
那麼,你的生活可能會更簡單'notifyAll()'...它不是真的應該喚醒一組特定的線程。它喚醒了所有線程。這就是爲什麼'wait()'總是出現在循環內部的原因。一旦被喚醒,線程本身應該檢查是否現在是喚醒的好時機,如果沒有,則返回'wait()'。但喚醒和通知是併發編程的低層次結構,你真的應該考慮使用Executor Framework來簡化併發模塊的組合。 – scottb
或java.util.concurrent包中的信號量。 – EJP