English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
java Object wait Methode
Wenn Thread B auf eine gemeinsame Ressource zugreift, möchte den Lock-Objekt der Ressource erhalten, stellt fest, dass dieser Lock bereits von Thread A besessen wird, in diesem Moment kann Thread B nur abgebrochen werden und auf die Freigabe des Locks durch Thread A warten.
Aber der Thread A, der den Lock bereits besitzt, möchte in der Ausführungsphase, weil bestimmte Bedingungen noch nicht erfüllt sind, nicht weiter ausführen und möchte zunächst warten (Beachtung: es ist Thread A, der bereits den Lock besitzt, der sich selbst aktiv warten möchte), und hofft, dass bestimmte Bedingungen erfüllt sind, um die Aufgabe fortzusetzen. In der synchronisierten Code-Sektion muss Thread A zunächst den Lock freigeben, damit Thread B berechtigt ist, den Lock zu erhalten, in die synchronisierte Code-Sektion einzutreten und den Code auszuführen. Nachdem Thread B ausgeführt hat, sind die erforderlichen Bedingungen von Thread A erfüllt, dann muss in diesem Moment ein Benachrichtigungsmechanismus vorhanden sein, um Thread A vom Wartezustand in den Ausführungsstatus zu versetzen und den Code fortzusetzen.
Einige Schüler glauben, dass Thread A auch ständig in einem Zyklus überprüfen kann, ob die Bedingung bereits erfüllt ist, und es nicht unbedingt erforderlich ist, sich selbst abzubrechen und zu warten. Dies ist auch eine Denkschiene, aber? Es verbraucht mehr CPU und es ist nicht bekannt, wann die Bedingung erfüllt sein wird.
Um die Koordination und Kommunikation zwischen Threads zu ermöglichen, muss ein Warte-Mechanismus und ein Benachrichtigungs-Mechanismus vorhanden sein, in Java entspricht dies den Methoden wait und notify.
Methode wait von Object
synchronized (obj) { while (Bedingung nicht ok){ obj.wait(); } }
Um den Thread A in den Wartezustand zu versetzen, kann die Methode wait des aktuellen Objekts aufgerufen werden. Wenn die Methode wait aufgerufen wird, bedeutet dies auch: Thread A hat den Lock erhalten und alles, was er tun kann, wurde getan, er kann jetzt nur warten, bis andere Synchronisationsoperationen einige Code-Ausführungen durchführen, dann komme ich zurück und setze meine Arbeit fort.
Hinweis:
Die Methode wait ist in der Rootklasse Object definiert, Thread erbt von der Klasse Object, daher hat Thread auch die Methode wait. Aber hier wird nicht die Methode wait des aktuellen Thread-Objekts aufgerufen, sondern die Methode wait des aktuellen Objekts mit dem Lock-Attribut; das verstehe ich auch nicht so recht, ich finde, dass es auch möglich ist, dies durch die Methoden wait und notify des Thread A zu erreichen, aber es scheint sehr kompliziert zu sein. Außerdem scheint es aus der Perspektive der Szene auch vernünftig zu sein, wait in Object zu definieren, was bedeutet, dass der Thread im Wartepool des Objekts hängt.
Vielen Dank für das Lesen, ich hoffe, es hilft Ihnen weiter, danke für Ihre Unterstützung für diese Website!