Erstens, eine wirklich dumme Frage, ich habe mich nur gefragt, was das wartende "Parken" bedeutet. Wartet der Thread darauf, geparkt zu werden, oder wurde er gerade geparkt und befindet sich daher im Wartezustand? Und wenn dieses Parken passiert, wie viel CPU- / Speicherressourcen werden verbraucht? Was ist der Zweck, einen Thread zu parken?
Zweitens, indem Sie sich die Parkmethode in der Java-Thread-API ansehen
Deaktiviert den aktuellen Thread für Thread-Planungszwecke, sofern die Genehmigung nicht verfügbar ist.
Wenn die Genehmigung verfügbar ist, wird sie verbraucht und der Anruf wird sofort zurückgegeben. Andernfalls wird der aktuelle Thread für Thread-Planungszwecke deaktiviert und ruht, bis eines von drei Dingen passiert .....
Englisch ist nicht meine Hauptsprache, daher habe ich einige Schwierigkeiten zu verstehen, dass ich "Erlaubnis" als eine Art "Erlaubnis zum Parken des Threads" beabsichtigte, also die folgenden Fragen:
- Was bedeutet das, was ist "Erlaubnis" und wer und wie prüft diese Erlaubnis?
- Was bedeutet das: "Wenn eine Genehmigung verfügbar ist, wird sie verbraucht", wird sie "geparkt"?
- Wenn der zweite Punkt zutrifft, was ist dann der Unterschied zwischen "Parken" und "Ruhen"? Wenn ich eine Erlaubnis habe, kann ich sie für immer parken und wenn nicht, kann ich sie "ruhend" machen?
Vielen Dank
quelle
park()
bedeutet also "Ich möchte meine Ausführung unterbrechen, bis mir ein anderer Thread durch Aufrufen eine Erlaubnis erteiltunpark()
".Gemäß der Java- Thread- Statusdokumentation kann ein Thread aus drei Gründen in den Status WARTEN wechseln:
Wenn Sie eine Parkmethode für einen Thread aufrufen, wird der Thread für Thread-Planungszwecke deaktiviert, sofern die Genehmigung nicht verfügbar ist. Sie können die Methode unpark aufrufen, um die Berechtigung für den angegebenen Thread verfügbar zu machen, sofern diese noch nicht verfügbar war.
Wenn sich Ihr Thread von LockSupport.park im WAITING-Modus befindet, wird er als WAITING (Parken) angezeigt.
Bitte beachten Sie, dass Sie park nur für den aktuellen Thread aufrufen können. Dies ist ein sehr hilfreicher Mechanismus zur Implementierung des Producer-Consumer-Design-Musters.
quelle
Aus der Klassenbeschreibung (oben im LockSupport-Javadoc ), in der die Genehmigung beschrieben wird:
(Ich habe den [Text] erweitert , um das Lesen für nicht englischsprachige Personen zu erleichtern.)
Hoffentlich kann jemand mit einem tieferen Verständnis darauf näher eingehen.Siehe die Antwort von axtavt.Als letzte Anmerkung ein letztes Zitat aus dem Javadoc:
quelle
Der Teil, der mich dazu brachte, diese Frage erneut zu beantworten, die ich beim Lesen der Dokumentation nicht umgehen konnte, war:
Also, wenn die Genehmigung "verfügbar" ist, wer und wie stellt sie zur Verfügung, damit sie sofort verbraucht werden kann? Das war irgendwie trivial herauszufinden:
Der Code spricht für sich selbst, der
thread
läuft, wird aber noch nicht aufgerufenLockSupport.park
, während ein anderer Thread ihn aufruftLockSupport.unpark
- wodurch die Erlaubnis verfügbar wird. Danach rufen wir anLockSupport.park
und das kehrt sofort zurück, da die Genehmigung verfügbar ist.Sobald man darüber nachdenkt, ist dies ein bisschen gefährlich, wenn Sie Ihre Fäden zu einem gewissen Code setzen Sie nicht kontrollieren , und dass Code Anrufe ,
LockSupport.unpark
während Siepark
danach - es könnte nicht funktionieren.quelle
So wie ich es verstehe, ist die "Erlaubnis" nur ein Objekt, das darstellt, ob ein Thread "entparkt" werden kann oder nicht. Und dies wird vom Thread selbst überprüft (oder de JRE, wenn Sie versuchen, einen Thread zu parken). Das "verbraucht" -Ding, ich verstehe, dass die Erlaubnis verschwindet und der Thread nicht deaktiviert wird.
Ich denke, Sie sollten ein bisschen mehr über Multithreading lernen. Stellen Sie sich das als Spender mit Objekten vor, die als "Erlaubnis" bezeichnet werden. Sie weisen einen Thread an, zu parken, und der Thread überprüft den Spender. Wenn es eine "Erlaubnis" gibt, nimmt der Thread sie und geht (ohne Park). Wenn sich im Spender keine "Erlaubnis" befindet, wird der Thread geparkt, bis eine "Erlaubnis" verfügbar ist (und Sie können mit eine "Erlaubnis" in den Spender legen
unpark
.Was die CPU- / Speichernutzung betrifft, denke ich, dass dies vom Betriebssystem usw. abhängt.
quelle