„Hallo, Amigo!“

„Jetzt erzähle ich Ihnen ein wenig über die Schlaf-, Ertrags- und Verbindungsmethoden.“

„Das ist langweilig. Ich habe gerade eine Interviewfrage gefunden: ‚Was ist der Unterschied zwischen den Methoden yield (), sleep () und wait ()?‘. Können Sie das erklären?“

„Kein Problem. Zunächst einmal sind das drei völlig unterschiedliche Methoden.“

1) Sleep(Timeout)  – stoppt den aktuellen Thread (für den Sleep aufgerufen wurde) für die durch den Timeout-Parameter angegebene Anzahl von Millisekunden. Der Thread wechselt dann in den Zustand TIMED_WAITING. Die Methode wird möglicherweise früher beendet, wenn das isInterrupted-Flag gesetzt ist.

Beispiel Beschreibung
Thread.sleep(500);
Der aktuelle Thread unterbricht seine eigene Ausführung für 500 Millisekunden oder 0,5 Sekunden.

2) yield()  – der aktuelle Thread „überspringt seinen Zug“. Der Thread geht vom laufenden Zustand in den Bereitschaftszustand über und die JVM fährt mit dem nächsten Thread fort. Die Zustände „Running“ und „Ready“ sind Unterzustände des Zustands „RUNNABLE“ .

Beispiel Beschreibung
Thread.yield();
Der aktuelle Thread „überspringt seinen Zug“ und Java wechselt sofort zum nächsten Thread.

3) wait(timeout)  – Dies ist eine Version der wait ()-Methode, jedoch mit einem Timeout. „Die Wait- Methode kann nur innerhalb eines synchronisierten Blocks für ein Mutex-Objekt aufgerufen werden, das vom aktuellen Thread gesperrt ist. Andernfalls löst die Methode eine illegale MonitorState- Ausnahme aus.

„Der Aufruf dieser Methode führt dazu, dass die Sperre des Mutex-Objekts aufgehoben wird, sodass es von einem anderen Thread erfasst werden kann. Darüber hinaus wechselt der Thread in den Status „WAITING“ (für die Methode „wait()“ ohne Parameter) oder in den Status „TIMED_WAITING“ (für die Methode „wait(timeout)“. ) Methode)."

Beispiel Beschreibung
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
Wenn die Wartemethode aufgerufen wird, gibt der aktuelle Thread die Sperre des Monitorobjekts frei und schläft 500 Millisekunden lang. Das Monitorobjekt kann von einem anderen Thread erfasst werden.
Nach 500 Millisekunden wird der Thread aktiviert. Wenn der Monitor nicht ausgelastet ist, erfasst der Thread ihn und arbeitet weiter.
Wenn der Monitor von einem anderen Thread gesperrt wird, wechselt der aktuelle Thread in den Status BLOCKED.

4) beitreten (Timeout)

„Diese Methode war nicht in Ihrer Frage, aber in meinem Unterrichtsplan, also erzähle ich Ihnen davon. Wenn Sie die Methode „join()“ oder „join(timeout)“ aufrufen, wird der aktuelle Thread an den Thread „angehängt“. der diese Methode aufgerufen hat. Der aktuelle Thread geht in den Ruhezustand und wartet, bis der Thread, mit dem er verbunden ist, beendet ist (d. h. der Thread, dessen Methode join() aufgerufen wurde).“

„Der aktuelle Thread geht für die Methode „join()“ in den Status „WAITING“ und für die Methode „join(timeout)“ in den Status „TIMED_WAITING“ über.

Beispiel Beschreibung
Thread thread = getWorkThread();
thread.join(500);
Der aktuelle Thread tritt dem workerThread-Thread bei und wartet auf dessen Ende.
Die Verbindung wird jedoch nach 500 Millisekunden getrennt und die Ausführung läuft weiter.

„Die Zeitüberschreitung in den Methoden wait(timeout) und join(timeout) bedeutet, dass die Methode in den Ruhezustand geht und auf etwas wartet, jedoch nicht länger als die in Millisekunden angegebene Zeitüberschreitung. Dann wacht sie auf.“

„Es scheint, dass das Einzige, was diese Methoden gemeinsam haben, die Zeitüberschreitung ist. Sie machen völlig unterschiedliche Dinge.“

„Ja, das stimmt.“