Der in diesem Kapitel verbundene Inhalt umfasst:
1. Einführung in den Schlaf ()
2. Schlaf () Beispiel
3. Vergleich zwischen Schlaf () und Wait ()
1. Einführung in den Schlaf ()
Sleep () ist in Thread.java definiert.
Die Funktion von Sleep () besteht darin, den aktuellen Fadenschlafen zu lassen, dh der aktuelle Thread wird vom "Laufstatus" zum "Schlaf (Blockierung)" eingebracht. Sleep () gibt die Schlafzeit an, und die Schlafzeit ist größer als/gleich der Schlafzeit. Die CPU soll ausgeführt werden.
2. Schlaf () Beispiel
Das Folgende ist ein einfaches Beispiel, um die Verwendung des Schlafes () zu demonstrieren.
Die Codekopie lautet wie folgt:
// Quellcode von sleepTest.java
Klasse Threada erweitert Thread {
public threada (String name) {
Super (Name);
}
public synchronisierte void run () {
versuchen {
für (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// Wenn ich durch 4 geteilt werden kann, schlafen Sie für 100 Millisekunden
if (i%4 == 0)
Thread.Sleep (100);
}
} catch (InterruptedException e) {
E. printstacktrace ();
}
}
}
öffentliche Klasse SleepTest {
public static void main (String [] args) {
Threada t1 = neuer Threada ("T1");
t1.start ();
}
}
Auslaufergebnisse:
Die Codekopie lautet wie folgt:
T1: 0
T1: 1
T1: 2
T1: 3
T1: 4
T1: 5
T1: 6
T1: 7
T1: 8
T1: 9
Ergebnisse Beschreibung:
Das Programm ist relativ einfach, starten Sie Thread T1 in der Hauptfaden -Haupthaupt. Nach dem Beginn von T1, wenn die Berechnung I in T1 durch 4 teilbar sein kann, schläft T1 100 Millisekunden durch Thread. Sleep (100).
Vergleich zwischen Sleep () und Wait ()
Wir wissen, dass die Funktion von Wait () darin besteht, dass der aktuelle Thread den "Waiting (Blocking) Status aus dem" Laufstatus "eingeben und auch die Synchronisationsschloss freigeben lässt. Die Funktion von Sleep () besteht darin, den aktuellen Thread den "Schlafstatus" aus dem "Laufstatus" einzugeben.
Wait () veröffentlicht jedoch das Synchronisationsschloss des Objekts, während der Schlaf () das Schloss nicht freigibt.
Das folgende Beispiel zeigt, dass Sleep () das Schloss nicht freigeben wird.
Die Codekopie lautet wie folgt:
// Quellcode von SleeplockTest.java
public class sleeplocktest {
privates statisches Objekt obj = neues Objekt ();
public static void main (String [] args) {
Threada t1 = neuer Threada ("T1");
Threada t2 = new threada ("t2");
t1.start ();
t2.Start ();
}
Statische Klasse Threada erweitert Thread {
public threada (String name) {
Super (Name);
}
public void run () {
// Holen Sie sich die Synchronisationsschloss des OBJ -Objekts
synchronisiert (obj) {
versuchen {
für (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// Wenn ich durch 4 geteilt werden kann, schlafen Sie für 100 Millisekunden
if (i%4 == 0)
Thread.Sleep (100);
}
} catch (InterruptedException e) {
E. printstacktrace ();
}
}
}
}
}
Auslaufergebnisse:
Die Codekopie lautet wie folgt:
T1: 0
T1: 1
T1: 2
T1: 3
T1: 4
T1: 5
T1: 6
T1: 7
T1: 8
T1: 9
T2: 0
T2: 1
T2: 2
T2: 3
T2: 4
T2: 5
T2: 6
T2: 7
T2: 8
T2: 9
Ergebnisse Beschreibung:
Zwei Threads T1 und T2 werden in der Hauptfaden -Haupthauptung gestartet. T1 und T2 beziehen sich auf die Synchronisationsschloss desselben Objekts in Run (), dh synchronisiert (OBJ). Während des T1 -Laufs wird Thread.Sleep (100) aufgerufen. Weil T1 das "Synchronous Lock von Obj gehalten" nicht freigibt!
Beachten Sie, dass T1 und T2, wenn wir Synchronized (OBJ) ausgeben und das Programm erneut ausführen, zueinander umgestellt werden können. Das Folgende ist der Quellcode nach der Synchronisierung der Kommentarstunde (OBJ):
Die Codekopie lautet wie folgt:
// sleeplocktest.java Quellcode (kommentiert synchronisiert (obj))
öffentliche Klasse SleeplockTest {
privates statisches Objekt obj = neues Objekt ();
public static void main (String [] args) {
Threada t1 = neuer Threada ("T1");
Threada t2 = new threada ("t2");
t1.start ();
t2.Start ();
}
Statische Klasse Threada erweitert Thread {
public threada (String name) {
Super (Name);
}
public void run () {
// Holen Sie sich die Synchronisationsschloss des OBJ -Objekts
// synchronisiert (obj) {
versuchen {
für (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// Wenn ich durch 4 geteilt werden kann, schlafen Sie für 100 Millisekunden
if (i%4 == 0)
Thread.Sleep (100);
}
} catch (InterruptedException e) {
E. printstacktrace ();
}
//}
}
}
}