Ich habe ein folgendes Programm:Legendes Java Warten und Benachrichtigen Methoden
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SimpleWaitNotify implements Runnable {
final static Object obj = new Object();
static boolean value = true;
public synchronized void flag() {
System.out.println("Before Wait");
try {
obj.wait();
} catch (InterruptedException e) {
System.out.println("Thread interrupted");
}
System.out.println("After Being Notified");
}
public synchronized void unflag() {
System.out.println("Before Notify All");
obj.notifyAll();
System.out.println("After Notify All Method Call");
}
public void run() {
if (value) {
flag();
} else {
unflag();
}
}
public static void main(String[] args) throws InterruptedException {
ExecutorService pool = Executors.newFixedThreadPool(4);
SimpleWaitNotify sWait = new SimpleWaitNotify();
pool.execute(sWait);
SimpleWaitNotify.value = false;
SimpleWaitNotify sNotify = new SimpleWaitNotify();
pool.execute(sNotify);
pool.shutdown();
}
}
Wenn ich auf obj warten, erhalte ich die folgende Ausnahme Exception in thread "pool-1-thread-1" java.lang.IllegalMonitorStateException: current thread not owner
für jeden der zwei Threads.
Aber wenn ich SimpleWaitNotify Monitor verwende, dann ist die Programmausführung ausgesetzt. Mit anderen Worten, ich denke, es unterbricht den aktuellen Ausführungs-Thread und wiederum den Executor. Jede Hilfe, um zu verstehen, was vor sich geht, würde gebührend gewürdigt werden.
Dies ist ein Bereich, in dem die Theorie und Javadoc einfach erscheinen, und da es nicht viele Beispiele gibt, hat konzeptionell eine große Lücke in mir hinterlassen.
Großartig. Kann man dasselbe erreichen, wenn man das zusammengesetzte Objekt 'obj' insgesamt loswird? – Maddy
@Maddy: Sie sollten in der Lage sein zu warten und auf "dies" zu benachrichtigen - aber es ist in der Regel eine schlechte Idee, wie "dies" ist in der Regel eine Referenz, auf die anderen Code hat, effektiv zugreifen. Einen privaten Verweis auf ein Objekt zu halten, von dem nur Ihr Code weiß, ist eine gute Vorgehensweise. –
Guter Punkt. Einverstanden. – Maddy