Ein gutes kleines Beispiel, um die Methode wait () und notify () in Java zu demonstrieren

8

Kann mir jemand bitte ein gutes kleines Beispiel zur Verfügung stellen, das wait () und notify () in Java demonstriert. Ich habe es mit dem folgenden Code versucht, aber es zeigt nicht, was ich erwartet habe.

%Vor%      %Vor%

Das Problem ist, dass die Methode in der Klasse WaitDemo nicht ausgeführt wird und gemäß meiner Idee sollte die SOP nach wait () ausgeführt werden. Bitte helfen Sie mir dabei.

    
Sourav Bag 02.12.2011, 15:27
quelle

7 Antworten

3

Sie haben zwei Ebenen von geschweiften Klammern { in Ihrem try -Block. Wenn Sie den inneren Satz entfernen (was anscheinend nichts zu tun hat), behebt dies das Problem?

Es gibt mehrere Beispiele, die alle den Einsatz demonstrieren. Der letzte Link ist eine Reihe von Ergebnissen, die Ihnen helfen können. Wenn Sie spezifischere Dinge benötigen, lassen Sie mich wissen, was Ihre App versucht, und ich kann versuchen, Beispiele zu finden, die für Ihre Situation spezifischer sind.

jefflunt 02.12.2011 15:30
quelle
1
%Vor%     
Vijay Bhatt 23.10.2015 09:43
quelle
1

Ich habe zwei Threads für ungerade Zahlen (OddThread) und für gerade Zahlen (EvenThread) erstellt. Innerhalb der run-Methode der einzelnen Threads verwendete ich das gemeinsame Objekt der Klasse Print, um printOdd () und printEven () für Odd bzw. EvenThread aufzurufen. Ich habe das gemeinsame Objekt von Print statisch gemacht, so dass nur eine Kopie erstellt wurde. Bei der Synchronisierung des Print-Objekts habe ich ein boolesches Flag verwendet, so dass der ungerade Thread, wenn er eine ungerade Zahl gedruckt hat, in den Wartezustand gesendet wird und gleichzeitig der gerade Thread zur Ausführung angezeigt wird. Die Logik wird so geschrieben, dass der ungerade Thread immer zuerst die ungerade Zahl druckt, egal was passiert, da das Flag auf "false" gesetzt ist und anfänglich verhindert wird, dass der gerade Thread in einen Wartezustand geht.

%Vor%     
Amardeep Bhowmick 22.03.2016 14:08
quelle
0

Ihr Problem besteht darin, dass Sie zwei Instanzen der Thread-Klasse erstellen. Wenn also wait () aufgerufen wird, ist es auf zwei verschiedenen Instanzen, von denen keine einen anderen Thread hat, der für Ihren Monitor konkurriert, noch gibt es einen anderen Thread, der notifyAll () aufruft, um den Thread aus seinem Wartezustand zu wecken / p>

So wird jeder Thread, den Sie gestartet haben, ewig warten (oder bis er aus einem anderen Grund unterbrochen wird).

Sie möchten, dass mehrere Threads auf denselben Monitor zugreifen, also versuchen Sie zunächst, etwas zu programmieren, bei dem der fragliche Code kein Thread ist, sondern einfach von einem Thread verwendet wird.

@normalocity hat bereits Links zu mehreren Beispielen bereitgestellt.

    
Robin 02.12.2011 15:58
quelle
0

Ich habe gerade diese Antwort aktualisiert, um ein < a href="http://sscce.org/"> SCCE .

Die Worker rufen pauseIfNeeded für den WorkerPauseManager auf. Wenn der Manager pausiert ist, wenn der Worker-Thread pauseIfNeeded () aufruft, rufen wir wait () auf, wodurch der aufrufende Thread wartet, bis ein anderer Thread notify () oder notifyAll () für das Objekt aufruft, auf das gewartet wird. Dies geschieht, wenn der Swing Event Dispatch Thread play () auf dem Manager aufruft, der wiederum notifyAll () aufruft.

Beachten Sie, dass Sie für das Objekt, für das Sie wait () oder notify () aufrufen, eine synchronisierte Sperre haben müssen. Da die Methoden im WorkerPauseManager synchronisiert sind, erhalten alle synchronisierten Methoden eine synchronisierte Sperre für den WorkerPauseManager selbst.

%Vor%     
Sam Barnum 02.12.2011 16:44
quelle
0

Was wait-Methode ist, wenn ein Thread einen synchronisierten Block ausgeführt hat, indem er ein Objekt gesperrt hat (wir nennen das Objekt "a"), dann innerhalb dieses synchronisierten Blocks, wenn der Thread die wait-Methode des Objekts "a" ausgeführt hat

%Vor%

Dann wird das Objekt freigegeben und der Thread muss in den Wartezustand gehen, bis er aus diesem Zustand freigegeben wurde.

und ein anderer Thread können nun das Objekt verwenden, weil es ein Release-Objekt ist. Also, wenn ein anderer Thread das Objekt gesperrt hat und es die Benachrichtigungsmethode von diesem Objekt wie

ausgeführt hat %Vor%

Dann kann einer der Threads, die durch das Objekt "a" in den Wartezustand gegangen sind, aus dem Wartezustand entlassen werden. Anders ausgedrückt, wenn notifyAll aufgerufen wird, werden alle Thread-Objekte aus diesem Zustand freigegeben.

    
Lasitha Lakmal 05.11.2017 06:58
quelle
-2
%Vor%     
Mahesh M 01.10.2012 11:49
quelle

Tags und Links