viernes, 30 de julio de 2010

java.lang.IllegalThreadStateException

Esta excepción tuve el gusto de conocerla hace poco y pareciera que era lanzada, en mi caso particular, cuando intentaba correr un hilo dos veces.

public class IllegalThreadStateExceptionExample {

protected FooThread fooThread = new FooThread();

public class FooThread extends Thread {
@Override
public void run() {
System.out.println("Foo Thread run!");
}
}

public void runThread() {
fooThread.start();
}

public static void main(String[] args) {
IllegalThreadStateExceptionExample example =
new IllegalThreadStateExceptionExample();
example.runThread();
example.runThread();
}
}

Resultado:

Foo Thread run!
Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at IllegalThreadStateExceptionExample.runThread(IllegalThreadStateExceptionExample.java:14)
at IllegalThreadStateExceptionExample.main(IllegalThreadStateExceptionExample.java:20)

Según la documentación de la clase:

"Lanzada para indicar que un hilo no está en un estado apropiado para la operación solicitada."

Al parecer cuando un hilo termina su ejecución en el método "run()", queda en un estado en el cual no puede volver a ejecutarse. Se puede solucionar rápidamente simplemente instanciando un nuevo hilo.

1 comentario:

  1. Si no me equivoco el enum java.lang.Thread.State documenta los estados de un Thread. En el unico estado para el cual es valido invocar el metodo start, es cuando el Thread esta en estado NEW, y eso sucede inmediatamente despues de haberlo instanciado. Así que tu apreciación es correcta en este caso.

    La clase Thread tiene un método getState que te permitiría conocer su estado. De modo que en tu ejemplo arriba, no necesariamente el thread instanciado dos veces ya termino, sino que simplemente ya no esta en estado NEW.

    ResponderEliminar