這是我的代碼和輸出是不同的任何時候,我運行的代碼。有時候,所有三個讀者會得到通知,並輸出結果是:notifyAll的()不會通知所有線程
等待計算...
等待計算...
等待計算...
成品
總是:4950Thread-1
總是:4950Thread-2
總計爲:4950Thread-0
有時候只有兩個或一個讀者會收到通知。 有什麼問題?
class Reader extends Thread {
Calculator c;
public Reader(Calculator calc) {
c = calc;
}
public void run() {
synchronized (c) {
try {
System.out.println("Waiting for calculation...");
c.wait();
} catch (InterruptedException e) {
}
System.out.println("Total is: " + c.total +Thread.currentThread().getName());
}
}
public static void main(String[] args) {
Calculator calculator = new Calculator();
new Reader(calculator).start();
new Reader(calculator).start();
new Reader(calculator).start();
new Thread(calculator).start();
}
}
class Calculator implements Runnable {
int total;
public void run() {
synchronized (this) {
for (int i = 0; i < 100; i++) {
total += i;
}
System.out.println("Finished");
notifyAll();
}
}
}
根據meta post,這個問題被聲稱是重複的,但這兩個被重複使用的「重複」都不適用。 How to use wait and notify in Java?提醒用戶,如果你真正希望等待對同一個對象,你必須對該對象進行同步。但是這個解決方案已經在做這個。 Java: notify() vs. notifyAll() all over again提醒用戶這甚至進一步從問題notify
和notifyAll
之間的差異。
適用於MacOS/JDK 1.8上的我! – fhossfel
計算器可以在Reader開始等待之前通知。 – Grief
順便說一句,延伸線程是不明智的。 – efekctive