Odd even number Drucken mit Thread

7

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.

    
Sourabh 16.05.2011, 12:20
quelle

11 Antworten

13

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

%Vor%

und die printEven Methode ähnlich.

Geben Sie dann NumberPrinter mit einem lock -Objekt an:

%Vor%

Ausgabe:

%Vor%     
aioobe 16.05.2011, 12:29
quelle
4

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.

    
Aaron Digulla 16.05.2011 12:31
quelle
2

Dasselbe kann mit der Lock-Schnittstelle gelöst werden:

NaturalOrder.java

%Vor%

OddNumberLock.java

%Vor%

EvenNumberLock.java

%Vor%     
Vijay Inani 03.05.2014 04:30
quelle
1

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.

    
Jan Zyka 16.05.2011 12:29
quelle
1

Ich habe diesen Weg

gemacht %Vor%     
Jignesh 23.11.2012 05:19
quelle
0

Sie verpassen das volatile Schlüsselwort in oddTurn variable. Ohne es gibt keine Garantien, dass die Threads den tatsächlichen Wert sehen.

    
Vladimir Ivanov 16.05.2011 12:28
quelle
0

i Benutzte ein gemeinsames Objekt, um die Ausführungsreihenfolge zu steuern

%Vor%     
Dungeon Hunter 14.03.2013 20:41
quelle
0

Hier ist meine Lösung ohne Wartezeiten oder Benachrichtigung. wait () und notify () / notifyAll (),
 Ich sehe keinen Grund, sie für diese Problembeschreibung zu verwenden.

%Vor%     
shreyas K N 04.03.2014 06:36
quelle
0

Ihr Code wurde mit Lock Interface korrigiert:

%Vor%     
Vijay Inani 03.05.2014 05:16
quelle
0
%Vor%

Ausgabe für Limit 5:

Geben Sie das Limit ein: 5

ungeraden Thread 1

sogar Thread 2

ungeraden Thread 3

sogar Thread 4

ungeraden Thread 5

    
sanket patel 26.09.2014 07:39
quelle
0

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%     
Prasanna 19.10.2014 03:29
quelle