2011-03-22 1023 views
6

Si uso start() en un objeto Thread y regresa el método run(), ¿es posible volver a llamar a start()?¿Puedo volver a iniciar un hilo después de que haya muerto?

por ejemplo,

MyThread myThread = new MyThread(); 
myThread.start(); 
// run method executes and returns in 2 seconds 
// sleep for 5 seconds to make sure the thread has died 
myThread.start(); 

Me pregunto porque mi código está lanzando IllegalThreadStateExceptions, por lo que quieren saber si es porque no se puede hacer lo anterior.

+2

Lee el javadoc Luke! –

+0

@Stephen Miré el javadoc, pero solo para el método start() que no lo hizo sonar muy claro. – Matt

+0

¿Huh? Lo que no está claro sobre la oración * "Nunca es legal comenzar un hilo más de una vez" * en un método llamado 'start()'? –

Respuesta

11

No, no puedes. ¡Y el Javadoc para el método Thread.start() te dice eso!

+0

Vaya ...entonces, ¿"comenzado" significa "se ha comenzado en algún punto", en lugar de "no muerto"? ¿Hay algo más que pueda hacer para reiniciar un hilo? – Matt

+0

¿Dónde aparece 'iniciado'? La documentación que estoy viendo dice "Nunca es legal comenzar un hilo más de una vez". Si ha escrito un 'Runnable' en lugar de extender' Thread', entonces el marco ejecutor le ofrece la posibilidad de volver a enviar un trabajo, o hacer que se ejecute periódicamente, etc. – dty

+0

Significa que "se ha iniciado en algún momento". – Greg

0

Desde el javadoc:

Nunca es legal para iniciar un hilo más de una vez. En particular, un hilo no se puede reiniciar una vez que ha completado la ejecución.

Consulte el Thread.start() javadoc para obtener más información.

Hay otras maneras de lograr lo que estás tratando de hacer. Por ejemplo, podría usar nuevos Hilos que continúen el trabajo que se hizo en el Hilo que ha terminado la ejecución. También es posible que desee investigar el java.util.concurrent package.

4

Desde un comentario:

¿Hay algo más que pudiera hacer para volver a iniciar un hilo?

Puede usar ThreadPoolExecutor, lo que le permitiría pasar tareas y dejar que el servicio asigne un hilo a una tarea. Cuando la tarea finaliza, el hilo permanece inactivo hasta que se realiza la siguiente tarea.

Por lo tanto, no reinicia un hilo, pero debería volver a hacer/reanudar una tarea.

-1

Quizás haya una mejor manera de hacerlo si desea que el hilo se detenga y se reinicie varias veces. Tengo un hilo de caché de teselas en C++ que hace algo similar; se detiene cuando está terminado, y no se usa cuando se necesita nuevamente. Soy nuevo en Java, pero por lo que puedo decir, puede usar Object.wait() para pausar y Object.notify() para reanudar los hilos. Tal vez podría verificarlos en la documentación y rediseñar su hilo para pausar y reanudar en lugar de salir.

+0

No sé por qué lo rechazaría ... funciona en C++ ... comenzar un nuevo hilo cada vez que necesita el mismo hilo es un desperdicio ... si necesita el mismo hilo para retenerse, es mejor simplemente pausar y reanudarlo. – TurtleToes

+1

Usar 'wait' y' notify' es _totally_ la forma incorrecta de estacionar una cadena para usarla en la ejecución de múltiples tareas. La forma correcta, por cierto, es utilizar un ejecutor (como 'ThreadPoolExecutor') para hacer el estacionamiento de subprocesos por usted. –

Cuestiones relacionadas