Top Menu

25 de marzo de 2013

Hilos -Threads- en Java

Los hilos en java son algo muy interesante ya que nos permiten realizar varias tareas "al mismo tiempo", ahora ¿por qué digo "al mismo tiempo"? Porque realmente no se da de forma paralela ya que se les asignan pequeños tiempos de ejecución a cada uno hasta que finalicen su tarea.

Imagen tomada de: escribojava.blogspot.com
Para ejemplificar esto creo que el mejor ejemplo es el siguiente:
Es como aquellos juegos de tablero que tienen dos fichas para los jugadores y un dado para ver cuantas casillas avanza y ambos tienen que llegar a la meta.

Haciendo una analogía de esto con respeto a los hilos, podemos decir que el tablero es la aplicación, las dos fichas son las dos tareas -hilos- que se están ejecutando "al mismo tiempo" y el resultado que da el dado es el tiempo que le asigna el sistema a cada hilo.

Con esto sabemos que una ficha llegará a la meta antes que la otra aunque una de ellas haya comenzado en segundo lugar. Y como esto se da en milésimas de segundo o alguna medida de tiempo muy pequeño entonces se ve como si se estuviera ejecutando en paralelo, aunque se da de manera concurrente.

Otra cosa es que un hilo no es un proceso, son conceptos diferentes.

Ahora a lo practico :D.

Ejemplo

Como sé que hay personas que ya saben un poco de hilos y les gusta ir al hueso les dejo un ejemplo. Pueden ver la demostración del ejemplo en este video solo dura 11 segundos.


Escogí este ejemplo porque por lo regular surge el problema que si tenemos una tarea que dura por ejemplo 1 minuto y esta se ejecuta al presionar un botón, este botón podrá volver a presionarse luego de finalizada la tarea es decir luego de 1 minuto, pero tal vez necesitamos presionar este botón varias veces para ejecutar más tareas. Entonces este problema se resuelve por medio de hilos.

En este ejemplo un botón es un jugador y las tareas son los balones que van por la pantalla en diferentes direcciones.

Puedes descargar el ejemplo (src) EjemploHIlo.zip
El código lo puedes ver acá: Código Ejemplo de Hilos en Java

Ahora sigamos con las explicaciones :D

¿Como creo un hilo en java?

Un hilo se puede crear de dos formas:
  • Por medio de la interfaz Runnable
  • Por medio de la clase Thread
Realmente es casi lo mismo, y en ambas se tiene que colocar un método run().

Por medio de Runnable:

La ventaja de este es que una clase puede tener varias interfaces, es decir varios implements. A diferencia de una clase extendida que únicamente puede ser heredada de una clase esto porque java no maneja herencia múltiple.

Código:
//Creación de hilo
class MiClase implements Runnable {
    //Este metodo es obligatorio ya que estamos implementando -usando una interface-
    public void run(){
        //Codigo que queremos ejecutar
    }
}

Para ejecutar el código que tenemos en run(), es decir para ejecutar el hilo debemos hacerlo de la siguiente manera:
MiClase claseHilo = new MiClase();
Thread hilo = new Thread( claseHilo );
hilo.start();

Ejecutando el hilo desde la misma clase:
//Creación de hilo
class MiClase implements Runnable {
    //Este metodo es obligatorio ya que estamos implementando -usando una interface-
    public void run(){
        //Codigo que queremos ejecutar
    }

    //Metodo para llamar a ejecutar el Hilo
    public void ejecutarHilo(){
        Thread hilo = new Thread( this );
        hilo.start();
    }
}

Ejecutando el hilo desde otra clase:
//Creación de hilo
class MiClase implements Runnable {
    //Este metodo es obligatorio ya que estamos implementando -usando una interface-
    public void run(){
        //Codigo que queremos ejecutar
    }
}

class Ejecutar {
    //Metodo para llamar a ejecutar el Hilo
    public void ejecutarHilo(){
        MiClase claseHilo = new MiClase();
        Thread hilo = new Thread( claseHilo );
        hilo.start();
    }
}

Por medio de Thread:

Código:
//Creación de hilo
class MiClase extends Thread {
    //Este metodo es obligatorio ya que estamos implementando -usando una interface-
    public void run(){
        //Codigo que queremos ejecutar
    }
}

Para ejecutar el código que tenemos en run(), es decir para ejecutar el hilo debemos hacerlo de la siguiente manera:
this.start();

Ejecutando el hilo desde la misma clase:
//Creación de hilo
class MiClase extends Thread {
    //Este metodo es obligatorio ya que estamos implementando -usando una interface-
    public void run(){
        //Codigo que queremos ejecutar
    }

    //Metodo para llamar a ejecutar el Hilo
    public void ejecutarHilo(){
        this.start();
    }
}

Ejecutando el hilo desde otra clase:
//Creación de hilo
class MiClase extends Thread {
    //Este metodo es obligatorio ya que estamos implementando -usando una interface-
    public void run(){
        //Codigo que queremos ejecutar
    }
}

class Ejecutar {
    //Metodo para llamar a ejecutar el Hilo
    public void ejecutarHilo(){
        MiClase claseHilo = new MiClase();
        claseHilo.start();
    }
}

¿Como parar un Hilo?

La clase Thread tiene un método para parar un hilo pero esta en desuso y no debe utilizarse. Pero también se puede parar el hilo de forma manual por ejemplo utilizando una variable booleana.

Ejemplo:
//Clase Hilo
class Hilo extends Thread {
    //Este metodo es obligatorio ya que estamos implementando -usando una interface-
    public void run(){
        //Codigo que queremos ejecutar
        //Ciclo infinito controlado
        int i = 0;
        while( seguir == true ){
            System.out.println("Valor"+i);
            i++;
        }
    }

    //Para parar el hilo unicamente cambiamos el estado 
    //De la variable de seguir a false
    public void parar(){
        seguir = false;
    }
 
    public Hilo(){
        seguir = true;
    }

    private boolean seguir;
 
}

//Clase Ejecutar
class Ejecutar {
    //Metodo para llamar a ejecutar el Hilo
    public void ejecutarHilo(){
        Hilo claseHilo = new Hilo();
        claseHilo.start();
        //Se ejecuta por 1 segundo el hilo y luego paramos el hilo
        try{ Thread.sleep(1000); }catch(Exception e){}
        claseHilo.parar();
    }

    public static void main( String[] arg ){
        new Ejecutar();
    }

    public Ejecutar(){
        ejecutarHilo();
    }
}

Espero que haya sido de utilidad. Dios te bendiga.

1 comentarios:

Unknown dijo...

Muy buena tu explicación Saludos

Publicar un comentario