Java Wait und Notify: IllegalMonitorStateException
Ich nicht ganz verstehen, wie wait
und notify
(von Object
) Arbeit, und infolgedessen bin ich gezwungen, um schlank nach unten, meine versuche in den folgenden code-Abschnitt.
Main.java:
import java.util.ArrayList;
class Main
{
public static Main main = null;
public static int numRunners = 4;
public static ArrayList<Runner> runners = null;
public static void main(String[] args)
{
main = new Main();
}
Main()
{
runners = new ArrayList<Runner>(numRunners);
for (int i = 0; i < numRunners; i++)
{
Runner r = new Runner();
runners.add(r);
new Thread(r).start();
}
System.out.println("Runners ready.");
notifyAll();
}
}
Runner.java:
class Runner implements Runnable
{
public void run()
{
try
{
Main.main.wait();
} catch (InterruptedException e) {}
System.out.println("Runner away!");
}
}
Derzeit bekomme ich eine IllegalMonitorStateException beim Aufruf Main.main.wait();
, aber ich verstehe nicht warum. Von was ich sehen kann, brauche ich zum synchronisieren Runner.run
, aber damit nehme ich an, es würde nur zu Benachrichtigen, einen thread, wenn die Idee ist, teilen Sie alle.
Habe ich mir angeschaut java.util.concurrent
, aber ich kann nicht finden, einen geeigneten Ersatz (vielleicht bin ich auch nur etwas fehlt).
Sie sollten nie warten und Benachrichtigen. Sie waren notwendig, mit der alten Java, aber jetzt sollten Sie nur verwendet werden, von Menschen, die schreiben-Bibliotheken. Sie sollten nun die Einrichtungen in java.util.gleichzeitige.
Vereinbaren Sie mit toto2, auch nachdem Sie die Synchronisierung dieser code wird nicht funktionieren. Was passiert, wenn die main ruft notifyAll, bevor alle anderen threads erreichen wait()?
Vereinbaren Sie mit toto2, auch nachdem Sie die Synchronisierung dieser code wird nicht funktionieren. Was passiert, wenn die main ruft notifyAll, bevor alle anderen threads erreichen wait()?
InformationsquelleAutor skeggse | 2011-08-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht
wait()
auf ein Objekt, wenn der aktuelle thread besitzt das Objekt überwachen. Um das zu tun, müssen Siesynchronize
drauf:Die gleiche Regel gilt für
notify()
/notifyAll()
als gut.Den Javadocs für
wait()
erwähnen:Und von
notify()
:Für die Menschen hier verlinkt, das Objekt, das Sie nennen
wait()
muss das gleiche Objekt Sie synchronisieren auf. Aufrufx.wait()
imsynchronized(y)
block wird der Ertrag der gleichen Ausnahme.InformationsquelleAutor dlev
Du bist Aufruf
wait
undnotifyAll
ohne Verwendung einessynchronized
block. In beiden Fällen wird der aufrufende thread muss eigenen den lock auf den monitor rufen Sie die Methode auf.Aus der docs für
notify
(wait
undnotifyAll
ähnliche Dokumentation, sondern verweisen aufnotify
für die größtmögliche Beschreibung):Nur ein thread wird in der Lage sein, um tatsächlich Ausfahrt
wait
einen Zeitpunkt nachnotifyAll
Sie haben alle zu erwerben, die dem gleichen monitor wieder - aber alle wurden benachrichtigt, sobald die erste beendet den synchronisierten block, der nächste wird die Sperre etc.InformationsquelleAutor Jon Skeet