"¡Hola, amigo! Aquí hay una pregunta interesante que ya te han hecho o que pronto tendrás. ¿ Cómo detienes un hilo en ejecución? "

Digamos que el usuario le dice al programa que «baje un archivo de Internet». El subproceso principal crea un subproceso secundario separado para este trabajo y le pasa un objeto cuyo método de ejecución contiene todas las acciones necesarias para descargar el archivo.

Pero de repente el usuario cambia de opinión. No quiere descargar el archivo. ¿Cómo cancelamos un trabajo y detenemos el hilo?

"Sí, dime cómo?"

" No podemos. Esa es la respuesta más común y correcta. No se puede detener un hilo. Solo él puede detenerse a sí mismo " .

Pero puede enviar una señal a un subproceso, de alguna manera diciéndole que ya no es necesario realizar el trabajo y que debe terminar. Así como el subproceso principal termina regresando del método principal, un subproceso secundario termina regresando del método de ejecución.

"¿Cuál es la mejor manera de hacer eso?"

"Puede agregar alguna variable, como un booleano . Si es verdadero , el hilo se ejecuta. Si es falso  , el hilo debe terminar. Así, por ejemplo:"

Código Descripción
class Clock implements Runnable
{
public void run()
{
while (true)
{
Thread.sleep(1000);
System.out.println("Tick");

if (!ClockManager.isClockRun)
return;
}
}
}

La clase Clock escribe «Tick» en la consola una vez por segundo para siempre

Si ClockManager.isClockRun es falso, el método de ejecución finaliza.

class ClockManager
{
public static boolean isClockRun = true;
public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
isClockRun = false;
}

}
El subproceso principal inicia un subproceso secundario (reloj) que debe ejecutarse para siempre

Espera 10 segundos y dale al reloj una señal para terminar.

El hilo principal completa su trabajo.

El hilo del reloj termina su trabajo.

"¿Qué pasa si tenemos varios hilos, entonces qué?"

"Es mejor tener una variable de este tipo para cada subproceso. Es más conveniente agregarla directamente a la clase. Podría agregar una variable booleana isRun allí. Sin embargo, es mejor agregar una variable booleana isCancel que se vuelve verdadera si la tarea es cancelado."

Código Descripción
class Clock implements Runnable
{
private boolean isCancel = false;

public void cancel()
{
this.isCancel = true;
}

public void run()
{
while (!isCancel)
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
La clase Clock escribe la palabra «Tick» en la consola una vez por segundo siempre que isCancel sea falso.

Cuando isCancel se vuelve verdadero, el método de ejecución finaliza.

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clock.cancel();
}
El subproceso principal inicia un subproceso secundario (reloj) que debe ejecutarse para siempre

Espere 10 segundos y  cancele la tarea llamando al método de cancelación.

El hilo principal completa su trabajo.

El hilo del reloj termina su trabajo.

"Lo tendré en cuenta. Gracias, Ellie".