LockSupport ist ein grundlegender Faden, der Primitive blockiert, um Schlösser und andere Synchronisierungsklassen zu erstellen.
Die Funktionen von Park () und unpark () in locksupport sollen Threads bzw. entsperren, und Park () und Unpark () stoßen nicht auf das Problem, die durch Thread verursacht werden können.
Weil Park () und unpark () Berechtigungen haben; Der Wettbewerb zwischen dem Thread Calling Park () und einem weiteren Thread, der versucht, zu entspannen (), bleibt aktiv.
Grundnutzung
LockSupport ist einem binären Semaphor sehr ähnlich (nur 1 Lizenz ist verfügbar). Wenn diese Lizenz nicht besetzt ist, erhält der aktuelle Thread die Lizenz und führt weiterhin aus. Wenn die Lizenz belegt wurde, wartet der aktuelle Thread, der darauf wartet, die Lizenz zu erhalten.
public static void main (String [] args) {locksupport.park (); System.out.println ("Block.");}Das Ausführen des Codes zeigt, dass der Haupt -Thread immer blockiert. Da die Lizenz standardmäßig belegt ist, kann die Lizenz bei der Anrufe von Park () nicht erhalten werden, sodass sie in einen Blockierstaat eingeht.
Der folgende Code: Verlassen Sie zuerst die Lizenz, erhalten Sie die Lizenz und der Haupt -Thread kann normal enden. Der Erwerb und die Veröffentlichung von LockSupport -Lizenzen entsprechen im Allgemeinen. Wenn Sie mehrmals entspannen, gibt es kein Problem, wenn Sie nur einmal parken. Infolgedessen befindet sich die Lizenz in einem verfügbaren Zustand.
public static void main (String [] args) {Thread = thread.currentThread (); Locksupport.unpark (Thread); // VeröffentlichenLocksupport ist nicht wieder eingetragen. Wenn ein Thread zweimal hintereinander Locksupport .Park () aufruft, blockiert der Thread definitiv.
public static void main (String [] args) löst eine Ausnahme aus {Thread = Thread.currentThread (); LockSupport.unpark (Thread); System.out.println ("a"); Locksupport.park (); System.out.println ("B"); Locksupport.park (); System.out.println ("C");}Dieser Code druckt A und B aus, druckt jedoch nicht C, da der Thread beim zweiten Mal keine Berechtigung erhalten kann.
Schauen wir uns die Reaktion der entsprechenden Interrupts von Locksupport an
public static void t2 () löst Ausnahme aus. + count); t.start (); Thread.Sleep (2000); // Thread t.interrupt () unterbrechen; System.out.println ("Hauptüber");}Der Thread druckt den Thread über. Dies bedeutet, dass der Thread, der aufgrund des Aufrufens von Park blockiert, auf eine Interrupt -Anforderung reagieren kann (der Interrupt -Status ist auf True festgelegt), aber keine InterruptedException wirft.
LockSupport -Funktionsliste
// Gibt das Blocker -Objekt zurück, das an den neuesten, nicht blockierten Park -Methodenaufruf bereitgestellt wird, und kehrt Null zurück, wenn der Anruf nicht blockiert ist. Statisches Objekt getBlocker (Thread T) // Deaktivieren Sie den aktuellen Thread, es sei denn, die Lizenz ist verfügbar. Statische Void Park () // Deaktivieren Sie den aktuellen Thread, bevor die Lizenz verfügbar ist. Static Void Park (Objektblocker) // Warten Sie für die Thread -Planung höchstens die angegebene Wartezeit, es sei denn, die Lizenz ist verfügbar. Statische Leere Parknanos (lange Nanos) // Deaktivieren Sie den aktuellen Thread, bevor die Lizenz verfügbar ist, und warten Sie höchstens auf die angegebene Wartezeit. Statische Leere Parknanos (Objektblocker, lange Nanos) // Für die Thread -Planung ist der aktuelle Thread vor dem angegebenen Zeitlimit deaktiviert, es sei denn, die Lizenz ist verfügbar. Statische Void Parkuntil (lange Frist) // Für die Thread -Planung ist der aktuelle Thread vor dem angegebenen Zeitlimit deaktiviert, es sei denn, die Lizenz ist verfügbar. Statische Void Parkuntil (Objektblocker, lange Frist) // Machen Sie es verfügbar, wenn die Lizenz eines bestimmten Threads noch nicht verfügbar ist. Statische Leere Unpark (Fadenfaden)
Locksupport -Beispiel
Durch den Vergleich von "Beispiel 1" und "Beispiel 2" unten können Sie ein klareres Verständnis für die Verwendung von Locksupport vermitteln.
Beispiel 1
public class waitTest1 {public static void main (String [] args) {threada ta = new threada ("ta"); synchronisiert (ta) {// Erhalten Sie die "Synchronisationsschloss von Object TA" über synchronisierte (ta) try {System.out.println (Thread.currentThread (). getName ()+"start ta"); ta.start (); System.out.println (Thread.currentThread (). GetName ()+"block"); // Der Hauptfaden wartet auf ta.wait (); System.out.println (Thread.currentThread (). GetName ()+"Fortsetzung"); } catch (interruptedException e) {e.printstacktrace (); }}} statischer Klasse Threada erweitert Thread {public threada (String name) {Super (name); } public void run () {synchronisiert (this) {// die Synchronisationsschloss des aktuellen Objekts über synchronisierte (this) system.out.println (Thread.currentThread (). getName ()+"Wakup Other"); benachrichtigen(); // aufwachen "Waiting Thread auf dem aktuellen Objekt"}}}} Beispiel 2
import Java.util.concurrent public static void main (String [] args) {threada ta = new threada ("ta"); // den Haupt -Thread mininead = thread.currentThread () abrufen; System.out.println (Thread.currentThread (). GetName ()+"start ta"); ta.start (); System.out.println (Thread.currentThread (). GetName ()+"block"); // Die Hauptfadenblöcke locksupport.park (Mainthead); System.out.println (Thread.currentThread (). GetName ()+"Fortsetzung"); } statische Klasse Threada erweitert Thread {public threada (String name) {super (name); } public void run () {system.out.println (Thread.currentThread (). getName ()+"wakup Other"); // wach den "Hauptfaden" locksupport.unpark (minartead) auf; }}} Auslaufergebnisse:
Hauptstart Tamain Blockta Wakup ONDERE MAIN
Beschreibung: Der Unterschied zwischen Park und Warten. Bevor Warten von Blöcken von Threads warten, muss die Synchronisationsschloss durch synchronisierte erhalten werden.