Hilos en Java

De ChuWiki

Qué es un hilo (thread)[editar]

Normalmente nuestro programa se ejecuta secuencialmente, instrucción por instrucción, una por una. Los hilos de java permiten que se ejecuten varias cosas simultáneamente. Cada hilo ejecuta una serie de instrucciones de java. Si tenemos varios hilos ejecutándose, podemos ejecutar simultáneamente distintas secuencias de instrucciones. Por ejemplo, puede haber un hilo encargado de actualizar un reloj en pantalla, otro hilo encargado de atender a un socket por el que recibimos mensajes, otro hilo encargado de ir guardando cosas en base de datos, etc.

Crear y arrancar el hilo[editar]

Para crear un hilo en java, primero debemos hacer una clase que implemente la interface Runnable

public class MiRunnable implements Runnable
{
    public void run ()
    {
         System.out.println ("Esto se ejecuta en otro hilo");
    }
}

Lo que esté en el método run() es lo que se ejecutará en un hilo separado.

Cuando queramos que empiece a ejecutarse, creamos una instancia de la clase Thread pasándole una instancia de MiRunnable y la arrancamos

MiRunnable miRunnable = new MiRunnable();
Thread hilo = new Thread (miRunnable);
hilo.start();  // Aquí empieza a ejecutarse el hilo


Dormir un hilo[editar]

Para dormir un hilo durante un cierto tiempo, basta con llamar al método sleep(). Puesto que este método lanza una excepción, debemos capturarla.

try
{
    Thread.sleep (1000);  // El tiempo en milisegundos
} 
catch (Exception e)
{
    // Tratamiento de la excepción
}


Terminar un hilo[editar]

Es bastante habitual hacer que un hilo se meta en un bucle infinito, realizando una tarea indefinidamente

public class MiRunnable implements Runnable
{
    public void run ()
    {
         while (true)
         {
            // Alguna tarea a realizar
         }
    }
}

Si queremos que este hilo termine y buscamos en la API de java, vemos que todos los métodos para detener hilos (Thread.destroy(), Thread.suspend(), etc) están obsoletos, desaconsejados, etc.

¿Cómo terminamos entonces el hilo?

La forma que habitualmente implemento, es poner una variable booleana que indica si el hilo debe terminarse y usarla en el while.

public class MiRunnable implements Runnable
{
    private boolean terminar = false;

    public void setTerminar (boolean terminar)
    {
        this.terminar=terminar;
    }

    public void run ()
    {
         while (!terminar)
         {
            // Alguna tarea a realizar
         }
    }
}

De esta forma, para terminar el hilo de forma segura, bastará con llamar al método setTerminar(true)

MiRunnable miRunnable = new MiRunnable();
Thread hilo = new Thread (miRunnable);
hilo.start();  // Aquí empieza a ejecutarse el hilo
...
miRunnable.setTerminar(true); // Aquí terminamos el hilo

Enlaces[editar]