Estate atento ya que en este post encontrarás la contestación que buscas.Esta sección fue evaluado por nuestros especialistas para asegurar la calidad y veracidad de nuestro post.
Solución:
Una vez que un hilo se detiene, no puede reiniciarlo. Sin embargo, no hay nada que le impida crear y comenzar un nuevo hilo.
Opción 1: Cree un nuevo hilo en lugar de intentar reiniciar.
Opcion 2: En lugar de dejar que el hilo se detenga, haz que espere y luego, cuando reciba una notificación, puedes permitir que vuelva a funcionar. De esta manera, el hilo nunca se detiene y nunca será necesario reiniciarlo.
Editar basado en el comentario:
Para “matar” el hilo, puede hacer algo como lo siguiente.
yourThread.setIsTerminating(true); // tell the thread to stop
yourThread.join(); // wait for the thread to stop
Es imposible terminar un subproceso a menos que el código que se ejecuta en ese subproceso compruebe y permita la terminación.
Dijiste: “Lamentablemente, debo matarlo/reiniciarlo… No tengo un control total sobre el contenido del hilo y, en mi situación, requiere un reinicio”.
Si el contenido del subproceso no permite la terminación de su ejecución, entonces no puede terminar ese subproceso.
En su publicación, dijo: “Mi primer intento fue con ExecutorService, pero parece que no puedo encontrar la manera de reiniciar una tarea. Cuando uso .shutdownnow ()…”
Si observa la fuente de “shutdownnow”, simplemente se ejecuta e interrumpe los subprocesos que se están ejecutando actualmente. Esto no detendrá su ejecución a menos que el código en esos subprocesos verifique si ha sido interrumpido y, si es así, detiene la ejecución. Así que shutdownnow probablemente no esté haciendo lo que piensas.
Permítanme ilustrar lo que quiero decir cuando digo que el contenido del hilo debe permitir que ese hilo se termine:
myExecutor.execute(new Runnable()
public void run()
while (true)
System.out.println("running");
);
myExecutor.shutdownnow();
Ese subproceso continuará ejecutándose para siempre, aunque se haya llamado a shutdownnow, porque nunca verifica si se ha terminado o no. Este hilo, sin embargo, se cerrará:
myExecutor.execute(new Runnable()
public void run()
while (!Thread.interrupted())
System.out.println("running");
);
myExecutor.shutdownnow();
Dado que este subproceso comprueba si se ha interrumpido/apagado/terminado o no.
Entonces, si desea un hilo que pueda cerrar, debe asegurarse de que verifique si se ha interrumpido. Si desea un hilo que pueda “cerrar” y “reiniciar”, puede crear un ejecutable que pueda tomar nuevas tareas como se mencionó anteriormente.
¿Por qué no puedes cerrar un hilo en ejecución? Bueno, en realidad mentí, puedes llamar a “yourThread.stop()”, pero ¿por qué es una mala idea? El subproceso podría estar en una sección sincronizada (u otra crítica, pero nos limitaremos a las secciones protegidas por la sección sincronizada). key palabra aquí) sección de código cuando lo detenga. Se supone que los bloques de sincronización deben ejecutarse en su totalidad y solo por un subproceso antes de que otro subproceso acceda a ellos. Si detiene un subproceso en medio de un bloque de sincronización, la protección establecida por el bloque de sincronización se invalida y su programa entrará en un estado desconocido. Los desarrolladores ponen cosas en bloques sincronizados para mantener las cosas sincronizadas, si usa threadInstance.stop() destruye el significado de sincronizar, lo que el desarrollador de ese código estaba tratando de lograr y cómo el desarrollador de ese código esperaba que sus bloques sincronizados comportarse.
Revisar java.lang.Thread
.
Para iniciar o reiniciar (una vez que se detiene un subproceso, no puede reiniciar ese mismo subproceso, pero no importa; simplemente cree un nuevo Thread
ejemplo):
// Create your Runnable instance
Task task = new Task(...);
// Start a thread and run your Runnable
Thread t = new Thread(task);
Para detenerlo, tenga un método en su Task
instancia que establece una bandera para decirle al run
método para salir; volviendo de run
sale del hilo. Si su código de llamada necesita saber que el hilo realmente se detuvo antes de que regrese, puede usar join
:
// Tell Task to stop
task.setStopFlag(true);
// Wait for it to do so
t.join();
Con respecto a reiniciar: Aunque un Thread
no se puede reiniciar, puede reutilizar su Runnable
instancia con un nuevo subproceso si tiene estado y desea conservarlo; eso viene a ser lo mismo. Solo asegúrate de que tu Runnable
está diseñado para permitir múltiples llamadas a run
.