Detaillierte Erläuterung und Beispiele für Java -Thread Sleep () und Wait ()
schlafen
1.S -Schlaf ist eine statische Methode des Fadens. Dadurch können die von Runnable implementierten Threads die Schlafmethode verwenden. Es wird auch vermieden, dass Sie vor Threads die Sleep () -Methode zueinander aufrufen, um Deadlocks zu verursachen.
2. Sleep () muss bei der Ausführung eine Schlafzeit erhalten. Während des Schlafes (während des Blockierungsfadens) wird die CPU diesen Faden aufgeben und andere Aufgaben ausführen. Wenn die Schlafzeit abgelaufen ist, wacht der Thread automatisch auf, aber der Thread wird nicht sofort ausgeführt, sondern wartet, dass die CPU Ressourcen bereitstellt, um mit anderen Themen zu konkurrieren.
3. Wenn dieser Faden zuvor ein Schloss erwirbt, wird das Schloss während des Schlafes nicht freigesetzt. Andere Programme, die auf diese Maschinensperre warten, müssen warten, bis dieser Thread nach der Ausführung aufwacht und ausgeführt wird.
Schlafbezogener Code
public class threadTest2 {public static void main (String [] args) {System.out.println ("Our Test"); ThreadSleepepep = new threadSeep (); Versuchen Sie {Thread Thread1 = neuer Thread (Sleep ", Passer a"); Thread Thread2 = neuer Thread (Schlaf, "Passant B"); Thread1.Start (); thread2.Start (); } catch (Ausnahme e) {e.printstacktrace (); } System.out.println ("Test ist vorbei"); }} Klasse threadSleep implementiert runnable {int count = 0; @Override public void run () {System.out.println (thread.currentThread (). GetName () + "Say: Hallo Schlaf !!"); zählen(); } public void count () {while (count <20) {System.out.println (Thread.currentThread (). getName () + "Say: count is" + count); Versuchen Sie {count ++; Thread.Sleep (100); } catch (Ausnahme e) {e.printstacktrace (); }}}}Ausgabeprotokoll
Beginnen Sie unseren Testtest IS Over Passerby A Says: Hallo Schlaf !! Passerby A sagt: Count ist 0 Passerby B sagt: Hallo Schlaf !! Passerby B sagt: Count ist 1 Passant A Says: Count Is 2 Passant B SAY: COUNT IS 2 PASSERBY A SAGE: Zähl ist 4 Passant Bay: Count ist 4 Passant A Says: Count ist 6 Passerby B sagt: Graf ist 7 Passant 7 Passerby B Says: Count ist 8 Passant Says: Graf 8 Passerby Says: Graf. Passerby B sagt: Count ist 14 Passant A Says: Count ist 14 Passant A.
Durch das Protokoll können wir feststellen, dass Thread A und Thread B im Grunde genommen abwechselnd ausgeführt werden, aber unregelmäßig sind und Parallelitätsprobleme aufweisen.
Diese Situation liegt daran, dass der Code die Schlafzeit auf 100 Millisekunden festlegt. Da die Ausführungsgeschwindigkeit der Anzahl der Zählerschritte sehr schnell ist, schläft der Faden fast gleichzeitig und wacht dann gleichzeitig auf und führt zu einer Parallelität.
Als nächstes müssen Sie einen Synchronisierungsblock hinzufügen, um zu überprüfen
public class threadTest2 {public static void main (String [] args) {System.out.println ("Our Test"); ThreadSleepepep = new threadSeep (); Versuchen Sie {Thread Thread1 = neuer Thread (Sleep ", Passer a"); Thread Thread2 = neuer Thread (Schlaf, "Passant B"); Thread1.Start (); thread2.Start (); } catch (Ausnahme e) {e.printstacktrace (); } System.out.println ("Test ist vorbei"); }} Klasse threadSleep implementiert runnable {int count = 0; @Override public void run () {System.out.println (thread.currentThread (). GetName () + "Say: Hallo Schlaf !!"); zählen(); } public void count () {while (count <20) {synchronized (this) {System.out.println (Thread.currentThread (). getName () + "Say: count is" + count); Versuchen Sie {count ++; Thread.Sleep (100); } catch (Ausnahme e) {e.printstacktrace (); }}}}}}Ausgabeprotokoll
Beginnen Sie unseren Testpasser und sagt: Hallo Schlaf !! Passerby A sagt: Count ist 0test ist über Passant B sagt: Hallo Schlaf !! Passerby A sagt: Graf ist 1 Passant a sagt: count ist 2 passerby a sagt: count ist 3 passerby a sagt: count is 4 passerby a sagt: count ist 5 passery a sagt: count ist 6 passerby a sagt: count ist 7 passerby a sagt: count ist 8 passerby a Says: Graf 9 Passerby As: Graf. 13-Passer A sagt: Graf ist 14-Passer A sagt: Graf ist 15-Passer A Says: Count Is 16-Passer A sagt: Graf ist 17-Passer A sagt: Count ist 18-Passer A sagt: Graf ist 19-Passer B sagt: Count Is 20
Aus dem Protokoll ist ersichtlich, dass im Grunde genommen Thread A ausgeführt wird. Dies liegt daran, dass das Maschinenschloss immer auf Faden A liegt, sodass Faden B nur warten können, bis ein Faden A das Schloss veröffentlicht.
Warten
1.Wait () ist eine Methode der Objektklasse. Wenn die Wait () -Methode aufgerufen wird, tritt der Thread in den mit dem Objekt zugeordneten Wartepool ein und gibt das Schloss frei.
2. Nachdem Wait () ausgeführt wurde, müssen Sie die Methode benachrichtigen () oder notifyAll () verwenden oder die Wartezeit (Wartezeit (lange) festlegen), um den Thread im Wartefadenpool aufzuwecken.
3.wait () muss in den synchronisierten Block platziert werden, ansonsten wird die Ausnahme von "Java.lang.IilleGalMonitorStateException" zur Laufzeit gemeldet.
Wartenbezogener Code
public class threadTest2 {public static void main (String [] args) {System.out.println ("Our Test"); ThreadSleepepep = new threadSeep (); Versuchen Sie {Thread Thread1 = neuer Thread (Schlaf ", Passman a"); Thread Thread2 = neuer Thread (Schlaf, "Passman B"); Thread1.Start (); thread2.Start (); } catch (Ausnahme e) {e.printstacktrace (); } System.out.println ("Test ist vorbei"); }} Klasse threadSleep implementiert runnable {int count = 0; @Override public void run () {System.out.println (thread.currentThread (). GetName () + "Say: Hallo Schlaf !!"); zählen(); } public void count () {while (count <20) {synchronized (this) {System.out.println (Thread.currentThread (). getName () + "Say: count is" + count); Versuchen Sie {count ++; Dies ist wartet (100); } catch (Ausnahme e) {e.printstacktrace (); }}}}}}Ausgabeprotokoll
Beginnen Sie unseren Testpasser und sagt: Hallo Schlaf !! Passerby A sagt: Count ist 0test ist über Passant B sagt: Hallo Schlaf !! Passerby B sagt: Count ist 1 Passant A Says: Count ist 2 Passant B SAY: COUNT IS 3 PASSERBY A SAGE: Zähl ist 4 Passant Bay: Count ist 5 Passant A Says: Count ist 6 Passant Bay B sagt: Graf ist 7 Passantin Passerby B sagt: Count ist 14 Passant A Says: Count Is 15 Passant B.
Durch das Protokoll ist festzustellen, dass im Wartezeit das Schloss freigegeben wird.
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!