Determinar cuándo termina un hilo

Avanzado

A menudo es útil saber cuándo ha terminado un hilo. Por ejemplo, en los ejemplos anteriores, en aras de la ilustración, fue útil mantener vivo el hilo principal hasta que los otros hilos terminaron. En esos ejemplos, esto se logró haciendo que el hilo principal se suspenda (sleep) más tiempo que los hilos secundarios que generó. ¡Esta es, por supuesto, una solución poco satisfactoria o generalizable!

1. isAlive() en Java

Afortunadamente, Thread proporciona dos medios por los cuales puedes determinar si un hilo ha terminado. Primero, puede llamar a isAlive() en el hilo. Su forma general se muestra aquí:

final boolean isAlive( )

El método isAlive() devuelve true si el hilo sobre el que se llama todavía se está ejecutando. Devuelve false de lo contrario. Para probar isAlive(), sustituya esta versión de MasHilos por la que se muestra en el programa anterior. (Leer Ejemplos de Hilos en Java)

//Uso de isAlive()
 class MasHilos {
     public static void main(String[] args) {
         System.out.println("Hilo principal iniciando.");

         MiHilo miHilo1 = MiHilo.crearYComenzar("#1");
         MiHilo miHilo2 = MiHilo.crearYComenzar("#2");
         MiHilo miHilo3 = MiHilo.crearYComenzar("#3");

         do {
             System.out.print(".");
             try{
                 Thread.sleep(100);
             }catch (InterruptedException exc){
                 System.out.println("Hilo principal interrumpido.");
             }
         } while (miHilo1.hilo.isAlive()||
                 miHilo2.hilo.isAlive()||
                 miHilo3.hilo.isAlive());
         System.out.println("Hilo Principal finalizado.");
     }
 }

Esta versión produce resultados similares a la versión anterior, excepto que main() termina tan pronto como terminan los otros hilos. La diferencia es que usa isAlive() para esperar a que los hilos hijos terminen. Otra forma de esperar que termine un hilo es llamar a join(), que se muestra aquí:

final void join() throws InterruptedException

2. join() en Java

Este método espera hasta que termine el hilo el cual se llama. Su nombre proviene del concepto de hilo de llamada en espera hasta que el hilo especificado se une a él. Las formas adicionales de join() le permiten especificar una cantidad máxima de tiempo que desea esperar para que finalice el hilo especificado.

Aquí hay un programa que usa join() para asegurar que el hilo principal sea el último en detenerse:

class MiHilo implements Runnable{
   Thread hilo;

   //Construye un nuevo hilo.
    MiHilo(String nombre){
        hilo= new Thread(this,nombre);
    }

    //Un método que crea e inicia un hilo.
    public static MiHilo crearYComenzar (String nombre){
        MiHilo miHilo=new MiHilo(nombre);
        miHilo.hilo.start(); //Inicia el hilo
        return miHilo;
    }

    //Punto de entrada de hilo.
    public void run(){
        System.out.println(hilo.getName()+" iniciando.");
        try {
            for (int count=0; count<10;count++){
                Thread.sleep(400);
                System.out.println("En "+hilo.getName()+ ", el recuento es "+count);
            }
        }catch (InterruptedException exc){
            System.out.println(hilo.getName()+ " interrumpudo.");
        }
        System.out.println(hilo.getName()+" terminado.");
    }
}
//Uso de join()
class UsoJoin {
     public static void main(String[] args) {
         System.out.println("Hilo principal iniciando.");

         MiHilo miHilo1 = MiHilo.crearYComenzar("#1");
         MiHilo miHilo2 = MiHilo.crearYComenzar("#2");
         MiHilo miHilo3 = MiHilo.crearYComenzar("#3");

         try{
             miHilo1.hilo.join();
             System.out.println("#1 unido");
             miHilo2.hilo.join();
             System.out.println("#2 unido");
             miHilo3.hilo.join();
             System.out.println("#3 unido");
         }catch (InterruptedException exc){
             System.out.println("Hilo principal interrumpido.");
         }
         System.out.println("Hilo principal finalizado.");
     }
 }

La salida de este programa se muestra aquí. Recuerde que cuando prueba el programa, su salida puede variar ligeramente.

Hilo principal iniciando.
#1 iniciando.
#3 iniciando.
#2 iniciando.
En #1, el recuento es 0
En #3, el recuento es 0
...
#2 unido
#3 unido
Hilo principal finalizado.

Como puede ver, después de que las llamadas a join() retornan, los hilos han dejado de ejecutarse.

Hilos en Java
  • Determinar cuándo termina

Sobre el Autor:

Hey hola! Yo soy Alex Walton y tengo el placer de compartir conocimientos hacía ti sobre el tema de Programación en Java, desde cero, Online y Gratis.

Deja una Respuesta

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.