Odd-Even-Number-Druck mit thread.Create eine Thread-Klasse, zwei Instanzen des Threads. Einer wird die ungerade Zahl und der andere die gerade Zahl drucken.
Ich habe die folgende Codierung gemacht. Aber es kommt zum toten Sperrzustand. Kann jemand bitte erklären, was der Grund dafür sein könnte?
%Vor%Ausgesprochen: ungerade1 even2
kommt dann zum Stillstand !!!!!!
Danke für Ihre Hilfe.
Sie warten und notifizieren verschiedene Objekte ( Monitore ).
Die Idee ist, dass du obj.wait()
aufrufen kannst, um darauf zu warten, dass jemand obj.notify()
macht, während du objA.wait()
und objB.notify()
tust.
Ändere deine printOdd
-Methode in etwas wie
und die printEven
Methode ähnlich.
Geben Sie dann NumberPrinter
mit einem lock
-Objekt an:
Ausgabe:
%Vor%Es gibt viele Fehler im Code.
Zunächst haben die synchronized
-Anweisungen keinerlei Auswirkungen. Sie erstellen zwei Thread-Instanzen, und jede ruft nur ihre eigenen Methoden auf. synchronized
ist nur nützlich, wenn ein anderer Thread eine Methode aufrufen kann.
Dann hat notifyAll()
aus denselben Gründen keine Wirkung. odd.notifyAll()
erreicht even
nicht in wait()
.
Was Sie also brauchen, ist ein anderes Objekt, das den Status enthält und das beide Threads sehen und verwenden können. Verwenden Sie synchronized
, wait()
und notifyAll()
für diese dritte Instanz.
Dasselbe kann mit der Lock-Schnittstelle gelöst werden:
NaturalOrder.java
%Vor%OddNumberLock.java
%Vor%EvenNumberLock.java
%Vor% Ich denke, das Problem könnte sein, dass printOdd
und printEven
bei einer anderen Sperre synchronisiert werden (die Objektinstanzsperren des Threads). Daher haben Sie nicht garantiert, dass die Änderung der statischen Variable oddTurn
im anderen Thread sichtbar ist. Versuchen Sie, oddTurn
volatil für den Start zu machen.
Sie verpassen das volatile
Schlüsselwort in oddTurn
variable. Ohne es gibt keine Garantien, dass die Threads den tatsächlichen Wert sehen.
i Benutzte ein gemeinsames Objekt, um die Ausführungsreihenfolge zu steuern
%Vor% Hier ist meine Lösung ohne Wartezeiten oder Benachrichtigung.
wait () und notify () / notifyAll (),
Ich sehe keinen Grund, sie für diese Problembeschreibung zu verwenden.
ungeraden Thread 1
sogar Thread 2
ungeraden Thread 3
sogar Thread 4
ungeraden Thread 5
Ich habe auf diese Weise basierend auf dem Argument implementiert, dass keine Threads erzeugt werden und das entsprechende Nein im Round-Robin-Modus. h., wenn die Anzahl der Threads 3 ist, wird Thread 1 1,4 ... drucken; Thread 2 druckt 2,5, ... und Thread 3 druckt 3,6 ...
%Vor%Tags und Links java multithreading thread-safety