2011-05-06 22 views
9

¿Cuándo llega un subproceso al estado terminado? ¿Se termina cuando se llega al final del método run()?¿Cómo verificar si el hilo ha finalizado?

Entonces, ¿cuál es la forma correcta de comprobar si un hilo finaliza? Porque la siguiente condición parece ser verdadera siempre para mí

if(!(thread.getState()).equals("TERMINATED")){} 

¿Alguna idea?

Respuesta

18

Primero: Thread.getState() devuelve un Thread.State, que nunca será igual a un String, por lo que había necesidad de escribir ese código como esto:

if(thread.getState()!=Thread.State.TERMINATED){ } 

Y sí: cuando los extremos run() método (ya sea normal o debido a que se produce una excepción), luego un Thread irá al estado TERMINATED.

+1

Gracias, @Art, por la solución. –

+5

'y sí: cuando el método run() finaliza (ya sea normalmente o porque arroja una excepción), un hilo pasará al estado TERMINATED. Eso no es verdad en realidad, con excepción de ejecución anormal llama a' UncaughtExceptionHandler 'y es libre de hacer lo que le plazca. (Incluye cosas como 'Thread.currentThread(). run()'), el hilo está en estado de terminación Después del método exit() que puede bloquear (infinitamente) en la sincronización 'ThreadGroup'. – bestsss

+1

@bestsss: y allí esperaba que nadie notara ese pequeño vacío ;-) Sí, tienes razón, por supuesto. –

12

prueba el método thread.isAlive()

... u opcionalmente, se unen hasta que termine con thread.join()

+1

Aparentemente .isAlive() tiene algunos problemas de sincronización: http://stackoverflow.com/questions/3140731/isalive-method-of-java-thread-is-not-working-properly – Simon

+0

@simon Creo que las conclusiones se hicieron hay engañoso. Parece claro que el estado del hilo se establece de forma asincrónica desde el hilo principal, por lo que no se puede esperar que la prueba inmediatamente después de iniciar el hilo funcione. De hecho, esperaría que el resultado de usar 'getState()' no fuera diferente. – orodbhen

Cuestiones relacionadas