Explicación detallada y ejemplos de Java Thread Sleep () y Wait ()
dormir
1. El sueño es un método estático de hilo. Esto habilita los hilos implementados por Runnable para usar el método de sueño. También evita llamar al método Sleep () entre sí antes de los hilos para causar puntos muertos.
2. Sleep () necesita recibir un tiempo de sueño al ejecutar. Durante el sueño (durante el hilo de bloqueo), la CPU abandonará este hilo y realizará otras tareas. Cuando se acelere la hora de dormir, el hilo se despertará automáticamente, pero el hilo no se ejecutará de inmediato, pero esperará a que la CPU asigne recursos para competir con otros hilos.
3. Además, si este hilo adquiere un bloqueo antes, el bloqueo no se liberará durante el sueño. Otros programas que esperan este bloqueo de la máquina deben esperar a que este hilo se despierte y se ejecute después de la ejecución.
Código relacionado con el sueño
public class ThreadTest2 {public static void main (string [] args) {System.out.println ("Comenzar nuestra prueba"); ThreadSleep Sleep = new ThreadSleep (); intente {Thread Thread1 = New Thread (Sleep, "Passer A"); Hilo hilo2 = nuevo hilo (dormir, "pasador b"); Thread1.Start (); thread2.start (); } catch (Exception e) {E.PrintStackTrace (); } System.out.println ("Test Is Over"); }} class ThreadSleep implements runnable {int count = 0; @Override public void run () {System.out.println (Thread.CurrentThread (). GetName () + "Di: ¡Hola, sleep!"); contar(); } public void count () {while (count <20) {system.out.println (thread.currentThread (). getName () + "Say: Count es" + Count); intente {count ++; Hilt.sleep (100); } catch (Exception e) {E.PrintStackTrace (); }}}}Registro de salida
Comience nuestra prueba de prueba está sobre el transeúnte A dice: ¡Hola, duerme! Passerby A dice: El recuento es 0 Passerby B dice: ¡Hola, duerme! Passerby B says : count is 1 Passerby A says : count is 2 Passerby B says : count is 2 Passerby A says : count is 4 Passerby B says : count is 4 Passerby A says : count is 6 Passerby B says : count is 7 Passerby B says : count is 8 Passerby A says : count is 8 Passerby A says : count is 10 Passerby B says : count is 10 Passerby B says : count is 12 Passerby A says : count is 12 Passerby B dice: El recuento es 14 Passerby A dice: El recuento es 14 Passerby A dice: El recuento es 16 Passerby B dice: El recuento es 16 Passerby A dice: El recuento es 18 Passerby B dice: El recuento es 18
A través del registro, podemos encontrar que el hilo A y el hilo B se ejecutan básicamente alternativamente, pero son irregulares y tienen problemas de concurrencia.
Esta situación se debe a que el código establece el tiempo de sueño a 100 milisegundos. Dado que la velocidad de ejecución de los incrementos de recuento es muy rápido, el hilo casi duerme al mismo tiempo y luego se despierta al mismo tiempo y hace que ocurra la concurrencia.
A continuación, debe agregar un bloque de sincronización para verificar si se libera el bloqueo de tiempo del sueño
public class ThreadTest2 {public static void main (string [] args) {System.out.println ("Comenzar nuestra prueba"); ThreadSleep Sleep = new ThreadSleep (); intente {Thread Thread1 = New Thread (Sleep, "Passer A"); Hilo hilo2 = nuevo hilo (dormir, "pasador b"); Thread1.Start (); thread2.start (); } catch (Exception e) {E.PrintStackTrace (); } System.out.println ("Test Is Over"); }} class ThreadSleep implements runnable {int count = 0; @Override public void run () {System.out.println (Thread.CurrentThread (). GetName () + "Di: ¡Hola, sleep!"); contar(); } public void count () {while (count <20) {sincronizado (this) {System.out.println (Thread.CurrentThread (). GetName () + "Say: Count es" + Count); intente {count ++; Hilt.sleep (100); } catch (Exception e) {E.PrintStackTrace (); }}}}}}Registro de salida
Comience nuestro Passer de prueba A dice: ¡Hola, duerme! Passerby A dice: el recuento es 0test está por encima del transeúnte B dice: ¡Hola, duerme! Passerby A dice: El recuento es 1 Passerby A dice: El conteo es 2 Passerby A dice: El recuento es 3 Passerby A dice: El recuento es 4 Passerby A dice: El recuento es 5 Passerby A dice: El recuento es 6 Passerby A Says: Count es 7 Passerby A Says: Count IS 8 Passerby A Dice: Count IS 9 Passerby A Says Dice: El Conde es 10 Passerby A Dice A: Count es 11 Passerby: Dice: Delds: el Conde. 13-Passer A dice: El recuento es 14 pasador A dice: El recuento es 15 pasador A dice: El recuento es de 16 pasadores A dice: El recuento es 17 pasador A dice: El recuento es 18 pasador A dice: El recuento es 19-pasador B dice: El recuento es 20
Se puede ver desde el registro que básicamente se está ejecutando A. Esto se debe a que durante el sueño, el bloqueo de la máquina siempre está en el hilo A, por lo que el subproceso B solo puede esperar hasta que el hilo A libera el bloqueo.
esperar
1.Wait () es un método de la clase de objeto. Cuando se llama al método Wait (), el hilo ingresa al grupo de espera asociado con el objeto y libera el bloqueo que tiene.
2. Después de ejecutar Wait (), debe usar el método Notify () o Notifyall () o establecer el tiempo de espera (espera (mucho tiempo)) para despertar el hilo en el grupo de hilo de espera.
3.Wait () debe colocarse en el bloque sincronizado, de lo contrario, la excepción "java.lang.illegalmonitorStateException" se informará en tiempo de ejecución.
Código relacionado con la espera
public class ThreadTest2 {public static void main (string [] args) {System.out.println ("Comenzar nuestra prueba"); ThreadSleep Sleep = new ThreadSleep (); intente {Thread Thread1 = New Thread (Sleep, "Passman A"); Hilo hilo2 = nuevo hilo (dormir, "passman b"); Thread1.Start (); thread2.start (); } catch (Exception e) {E.PrintStackTrace (); } System.out.println ("Test Is Over"); }} class ThreadSleep implements runnable {int count = 0; @Override public void run () {System.out.println (Thread.CurrentThread (). GetName () + "Di: ¡Hola, sleep!"); contar(); } public void count () {while (count <20) {sincronizado (this) {System.out.println (Thread.CurrentThread (). GetName () + "Say: Count es" + Count); intente {count ++; this.lait (100); } catch (Exception e) {E.PrintStackTrace (); }}}}}}Registro de salida
Comience nuestro Passer de prueba A dice: ¡Hola, duerme! Passerby A dice: el recuento es 0test está por encima del transeúnte B dice: ¡Hola, duerme! Passerby B dice: El recuento es 1 Passerby A dice: El conteo es 2 Passerby B dice: El recuento es 3 Passerby A dice: El recuento es 4 Passerby B dice: El recuento es 5 Passerby A dice: El recuento es 6 Passerby B, el recuento es 7 Passerby A dice: El recuento es 8 Passerby B Dice: Count IS 9 Passerby A Says Dice: IS 10 Passerby: el conteo: el conteo 11 Passerby A: el recuento es: el Conde. Passerby B dice: El recuento es 14 Passerby A dice: El recuento es 15 Passerby B dice: El recuento es 16 Passerby A dice: El recuento es 17 Passerby B dice: El recuento es 18 Passerby A dice: El recuento es 19
A través del registro, se puede encontrar que en el caso de Wait, se lanzará el bloqueo.
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!