El contenido involucrado en este capítulo incluye:
1. Introducción al sueño ()
2. Duerme () Ejemplo
3. Comparación entre el sueño () y Wait ()
1. Introducción al sueño ()
Sleep () se define en Thread.java.
La función de Sleep () es dejar que el hilo actual duerma, es decir, el hilo actual entrará desde el "estado en ejecución" al "bloqueo (bloqueo)". Sleep () especificará el tiempo de sueño, y el tiempo de sueño del hilo será mayor que/igual que el tiempo de sueño; La CPU se programará para ejecutar.
2. Duerme () Ejemplo
El siguiente es un ejemplo simple para demostrar el uso del sueño ().
La copia del código es la siguiente:
// Código fuente de Sleeptest.java
clase Thread extiende el hilo {
Public Thread (nombre de cadena) {
super (nombre);
}
Public sincronizado void run () {
intentar {
para (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// Cuando pueda dividirme por 4, duerme durante 100 milisegundos
if (i%4 == 0)
Hilt.sleep (100);
}
} capt (interruptedException e) {
E.PrintStackTrace ();
}
}
}
clase de sueño de clase pública {
public static void main (string [] args) {
Thinta t1 = new thinda ("t1");
t1.start ();
}
}
Resultados de ejecución:
La copia del código es la siguiente:
T1: 0
T1: 1
T1: 2
T1: 3
T1: 4
T1: 5
T1: 6
T1: 7
T1: 8
T1: 9
Descripción de los resultados:
El programa es relativamente simple, inicie el hilo T1 en el hilo principal principal. Después de comenzar T1, cuando el cálculo I en T1 puede ser divisible por 4, T1 dormirá durante 100 milisegundos a través de hilos.
Comparación entre el sueño () y Wait ()
Sabemos que la función de Wait () es permitir que el hilo actual ingrese al estado "Wait (Bloqueo) desde el" Estado en ejecución "y también libere el bloqueo de sincronización. La función de Sleep () es dejar que el hilo actual ingrese al "estado de sueño (bloqueo)" del "estado en ejecución".
Sin embargo, Wait () libera el bloqueo de sincronización del objeto, mientras que Sleep () no libera el bloqueo.
El siguiente ejemplo muestra que Sleep () no liberará el bloqueo.
La copia del código es la siguiente:
// código fuente de sleeplocktest.java
clase pública SleepLockTest {
objeto estático privado obj = nuevo objeto ();
public static void main (string [] args) {
Thinta t1 = new thinda ("t1");
Thinta t2 = new thinda ("t2");
t1.start ();
t2.start ();
}
La clase estática Thread extiende el hilo {
Public Thread (nombre de cadena) {
super (nombre);
}
public void run () {
// Obtener el bloqueo de sincronización del objeto OBJ
sincronizado (obj) {
intentar {
para (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// Cuando pueda dividirme por 4, duerme durante 100 milisegundos
if (i%4 == 0)
Hilt.sleep (100);
}
} capt (interruptedException e) {
E.PrintStackTrace ();
}
}
}
}
}
Resultados de ejecución:
La copia del código es la siguiente:
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
Descripción de los resultados:
Se inician dos hilos T1 y T2 en el hilo principal principal. T1 y T2 se referirán al bloqueo de sincronización del mismo objeto en run (), es decir, sincronizado (obj). Durante la ejecución de T1, aunque llamará a Thread.sleep (100); ¡Porque T1 no libera el "bloqueo sincrónico en poder de OBJ"!
Tenga en cuenta que si comentamos sincronizado (OBJ) y ejecutamos el programa nuevamente, T1 y T2 pueden cambiarse entre sí. El siguiente es el código fuente después de que la melodía de comentarios sincronizada (OBJ):
La copia del código es la siguiente:
// código fuente de sleeplocktest.java (comentado sincronizado (obj))
clase pública SleepLockTest {
objeto estático privado obj = nuevo objeto ();
public static void main (string [] args) {
Thinta t1 = new thinda ("t1");
Thinta t2 = new thinda ("t2");
t1.start ();
t2.start ();
}
La clase estática Thread extiende el hilo {
Public Thread (nombre de cadena) {
super (nombre);
}
public void run () {
// Obtener el bloqueo de sincronización del objeto OBJ
// sincronizado (obj) {
intentar {
para (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// Cuando pueda dividirme por 4, duerme durante 100 milisegundos
if (i%4 == 0)
Hilt.sleep (100);
}
} capt (interruptedException e) {
E.PrintStackTrace ();
}
//}
}
}
}