Zgoda za umieszczeniem metod wait (), replace () w klasie Object [duplikat]
To pytanie ma już odpowiedź tutaj:
Jak można wywoływać metody wait () i powiadomienie () na obiektach, które nie są wątkami? 9 odpowiedzi Trudno mi zrozumieć koncepcję umieszczeniawait()
wObject
klasa. W przypadku tych pytań rozważ, czywait()
inotifyAll()
są wThread
klasa
class Reader extends Thread {
Calculator c;
public Reader(Calculator calc) {
c = calc;
}
public void run() {
synchronized(c) { //line 9
try {
System.out.println("Waiting for calculation...");
c.wait();
} catch (InterruptedException e) {}
System.out.println("Total is: " + c.total);
}
}
public static void main(String [] args) {
Calculator calculator = new Calculator();
new Reader(calculator).start();
new Reader(calculator).start();
new Reader(calculator).start();
calculator.start();
}
}
class Calculator extends Thread {
int total;
public void run() {
synchronized(this) { //Line 31
for(int i=0;i<100;i++) {
total += i;
}
notifyAll();
}
}
}
Moje pytanie brzmi, jaką różnicę mogło to spowodować? W wierszu 9 uzyskujemy blokadę na obiekcie c, a następnie wykonujemy czekanie, które spełniają warunek oczekiwania, że musimy uzyskać blokadę na obiekcie przed użyciem oczekiwania, podobnie jest w przypadku powiadomienia Wszystkie uzyskaliśmy blokadę na obiekcie kalkulatora w linii 31 .