Der Unterschied zwischen Sleep(), Wait(), Join(), Yield()

(1) Sperrenpool
Alle Threads, die um Synchronisierungssperren konkurrieren müssen, werden im Sperrenpool platziert. Wenn beispielsweise die Sperre des aktuellen Objekts von einem Thread erworben wurde, müssen andere Threads in diesem Sperrenpool warten. Nachdem der vorherige Thread die Synchronisationssperre aufgehoben hat, konkurrieren die Threads im Sperrpool um die Synchronisationssperre. Wenn ein Thread diese erhält, tritt er in die Bereitschaftswarteschlange ein und wartet auf die Zuweisung von CPU-Ressourcen.

(2) Wartepool
Wenn wir die Methode wait () aufrufen, wird der Thread in den Wartepool gestellt und die im Pool wartenden Threads konkurrieren nicht um die Synchronisationssperre. Nur Threads, die nach dem Aufruf von notify() oder notifyAll() im Pool warten, beginnen mit dem Wettbewerb um Sperren. notify() dient dazu, zufällig einen Thread aus dem Wartepool auszuwählen und in den Sperrpool zu legen, und notifyAll() dient dazu, alle Threads im Wartepool in den Sperrpool zu legen.

(1) Sleep ist eine statische lokale Methode der Thread-Klasse und Wait ist eine lokale Methode der Object-Klasse.
(2) Die Schlafmethode gibt die Sperre nicht frei, aber die Wartemethode gibt sie frei und fügt den Thread zur Warteschlange hinzu. Im Ruhezustand wird die Ausführungsqualifikation der CPU aufgegeben und die Ausführung dieses Threads gestoppt. Nach Ablauf der geplanten Zeit wird die CPU-Ressource abgerufen und nimmt an der CPU-Planung teil. Nachdem die CPU-Ressource abgerufen wurde, kann sie weiter ausgeführt werden. Wenn die Thread hat Wenn die Sperre gesperrt ist, wird die Sperre nicht aufgehoben, aber die Sperre wird in den eingefrorenen Zustand versetzt, was bedeutet, dass andere Threads, die die Sperre benötigen, die Sperre nicht erhalten können. Wenn andere Threads während der Ruhephase die Interrupt-Methode dieses Threads aufrufen, löst dieser Thread auch eine InterruptException-Ausnahmerückgabe aus, die mit der Wartemethode identisch ist.
(3) Sleep hängt nicht vom synchronisierten Synchronisierer ab, Wait muss sich jedoch auf das synchronisierte Schlüsselwort verlassen.
(4) Der Schlaf muss nicht geweckt werden (Ausgangsblockierung nach dem Schlaf), das Warten jedoch schon.
(5) Sleep wird im Allgemeinen verwendet, um den aktuellen Thread in den Ruhezustand zu versetzen, oder um den Betrieb durch Abfragen anzuhalten, während Wait hauptsächlich für die Kommunikation zwischen mehreren Threads verwendet wird.
(6) Der Ruhezustand verschwendet CPU-Ausführungszeit und erzwingt einen Kontextwechsel. Warten ist jedoch nicht unbedingt erforderlich. Nach dem Warten besteht immer noch die Möglichkeit, erneut mit der Sperre zu konkurrieren, um die Ausführung fortzusetzen.

Nach der Ausführung von yield () wechselt der Thread direkt in den Bereitschaftszustand und gibt sofort das Ausführungsrecht der CPU frei, behält jedoch weiterhin die Ausführungsqualifikation der CPU bei, sodass es möglich ist, dass der nächste Thread von der CPU geplant wird Ermöglichen Sie dem Thread, das Ausführungsrecht zu erhalten und die Ausführung fortzusetzen.

Nachdem Join () ausgeführt wurde, wechselt der Thread in den Blockierungsstatus. Beispielsweise ruft Thread B Join () von Thread A auf, und Thread B tritt in die Blockierungswarteschlange ein, bis Thread A den Thread beendet oder unterbricht.

Guess you like

Origin blog.csdn.net/weixin_49131718/article/details/131794245