15 de marzo de 2015

Java Thread


Thread: Crear aplicaciones cocurrentes.

La implementacion de hilos en Java se puede hacer de dos formas:
  • Heredando de la clase Thread
  • Implementando la interface Runnable
 La forma recomendad para hacerlo es implementando la interface Runnable. Pero esto genera dos dudas:
  • Como iniciarlo.
  • Como detenerlo.
 El inicio es sencillo:

        Thread myThread = new Thread(new MyThread());
        myThread.start();
       

 Como detenerlo es lo complicado, pero no lo es, la clase Thread proporciona un metodo stop(), pero este ya no se debe usar, es inseguro y puede que no detenga el hilo de forma apropiada.

Una forma recomendada es usar el metodo interrupt(), pero hay que implementarlo bien, para que el hilo se pueda detener. Se deben tener en cuenta lo siguiente:
  • Tener una variable (flag) para saber cuando se debe detener el hilo.
  • Controlar las excepciones tipo InterruptedException
  • Estar preguntando si el hilo donde se esta ejecutando fue interunpido.

Ejemplo:

 public class MyThread implements Runnable {

    private volatile boolean stop = true;

    @Override
    public void run() {
        stop = false;
        while (!stop) {
          
            try{
                Thread.sleep(1000);
            }catch(InterruptedException interruptedException){
                stop = true;
            }

            if (Thread.currentThread().isInterrupted()) {
                stop = true;
            }
        }//End While

    }//End run

}//End class

Tenemos la varible "stop" de tipo boolean y "volatil", con la cual vamos a detener el while y parar el hilo.

Si tenemos un Thread.sleep, se debe controlar la excepcion arrojada, porque si el hilo fue interrumpido la excepcion es arroja, y esto quiere decir que el hilo lo estan intentado detener.

Se esta preguntando con el llamado "Thread.currentThread().isInterrupted()", para saber si fue interrumpido, si este fue interrumpido, se debe controlar la terminacion del hilo. Tener en cuenta que es posible usar "Thread.interrupted()" para saber si fue interrumpido,  pero cambia el valor de la bandera (flag) interna del la clase Thread y puede afectar posteriores llamados, Thread.currentThread().isInterrupted() solo obtiene el valor mas no lo cambia.

Y para terminar el hilo solo se debe llamar:

myThread.interrupt();

Hilo Terminado.


Referencias: