Ejemplo de Java - obtener el estado del hilo

Java 实例Ejemplo de Java

En el ciclo de vida de los hilos de Java, la clase Thread tiene un tipo enumerado State que define varios estados del hilo, que son:

  • New
  • Runnable
  • Blocked
  • Waiting
  • Timed Waiting
  • Terminated

Descripción de cada estado:

1. Estado inicial - NEW

Declaración:

public static final Thread.State NEW

Implementar la interfaz Runnable y heredar de Thread permite obtener una clase de hilo. Al crear una instancia con new, el hilo entra en el estado inicial.

2. RUNNABLE

Declaración:

public static final Thread.State RUNNABLE

2.1. Estado listo

El estado listo solo significa que tienes derecho a ejecutarte; si el planificador no te selecciona, permanecerás siempre en estado listo.

Al llamar al método start() del hilo, este hilo entra en estado listo.

Cuando el método sleep() del hilo actual termina, el join() de otro hilo termina, la espera de entrada del usuario finaliza, o un hilo obtiene el bloqueo del objeto, estos hilos también entrarán en estado listo.

Cuando se agota el quantum de tiempo del hilo actual o se llama al método yield() del hilo actual, el hilo actual entra en estado listo.

Cuando un hilo en el grupo de bloqueos obtiene el bloqueo del objeto, entra en estado listo.

2.2. Estado en ejecución

Es el estado en el que se encuentra un hilo cuando el planificador de hilos lo selecciona de la piscina ejecutable como hilo actual. Esta es también la única forma en que un hilo entra en estado de ejecución.

3. Estado bloqueado - BLOCKED

Declaración:

public static final Thread.State BLOCKED

El estado bloqueado es el estado en el que el hilo se bloquea al entrar en un método o bloque de código modificado por la palabra clave synchronized (al obtener el bloqueo).

4. En espera - WAITING

Declaración:

public static final Thread.State WAITING

Los hilos en este estado no reciben tiempo de ejecución de CPU; deben esperar a ser despertados explícitamente; de lo contrario, permanecerán en espera indefinida.

5. Espera con tiempo límite - TIMED_WAITING

Declaración:

public static final Thread.State TIMED_WAITING

Los hilos en este estado no reciben tiempo de ejecución de CPU, pero no necesitan esperar indefinidamente a ser despertados explícitamente por otros hilos; se despiertan automáticamente después de un cierto tiempo.

6. Estado terminado - TERMINATED

Declaración:

public static final Thread.State TERMINATED

Cuando el método run() del hilo se completa, o cuando el método main() del hilo principal se completa, consideramos que ha terminado. El objeto hilo puede estar vivo, pero ya no es un hilo que se ejecuta de forma independiente. Una vez que un hilo termina, no puede revivir.

Llamar al método start() en un hilo terminado lanzará la excepción java.lang.IllegalThreadStateException.

El siguiente ejemplo demuestra cómo obtener el estado de un hilo:

Archivo Main.java

//Programa Java - demostrar el estado de los hilos class thread implements Runnable { public void run() { //thread2 - espera con tiempo límite try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("State of thread1 while it called join() method on thread2 -"+ Test.thread1.getState()); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } public class Test implements Runnable { public static Thread thread1; public static Test obj; public static void main(String[] args) { obj = new Test(); thread1 = new Thread(obj); //Se crea thread1, ahora está en estado inicial System.out.println("State of thread1 after creating it - " + thread1.getState()); thread1.start(); //thread1 - estado listo System.out.println("State of thread1 after calling .start() method on it - " + thread1.getState()); } public void run() { thread myThread = new thread(); Thread thread2 = new Thread(myThread); //Se crea thread1, ahora está en estado inicial System.out.println("State of thread2 after creating it - "+ thread2.getState()); thread2.start(); //thread2 - estado listo System.out.println("State of thread2 after calling .start() method on it - " + thread2.getState()); // moving thread1 to timed waiting state try { //moving - espera con tiempo límite Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("State of thread2 after calling .sleep() method on it - "+ thread2.getState() ); try { //Esperando a que thread2 termine thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("State of thread2 when it has finished it's execution - " + thread2.getState()); } }

La salida del código anterior es:

State of thread1 after creating it - NEW
State of thread1 after calling .start() method on it - RUNNABLE
State of thread2 after creating it - NEW
State of thread2 after calling .start() method on it - RUNNABLE
State of thread2 after calling .sleep() method on it - TIMED_WAITING
State of thread1 while it called join() method on thread2 -WAITING
State of thread2 when it has finished it's execution - TERMINATED

Java 实例Ejemplo de Java

Otras extensiones