"Ciao, Amigo! Ecco una domanda interessante che hai già avuto o lo farai presto. Come interrompi un thread in esecuzione? "

Diciamo che l'utente dice al programma di «scaricare un file da Internet». Il thread principale crea un thread figlio separato per questo processo e gli passa un oggetto il cui metodo run contiene tutte le azioni necessarie per scaricare il file.

Ma improvvisamente l'utente cambia idea. Non vuole scaricare il file. Come annulliamo un lavoro e interrompiamo il thread?

"Sì, dimmi come?"

" Non possiamo. Questa è la risposta più comune e più corretta. Non puoi fermare un filo. Solo esso può fermarsi da solo. "

Ma puoi inviare un segnale a un thread, dicendogli in qualche modo che il lavoro non deve più essere eseguito e che dovrebbe terminare. Proprio come il thread principale termina restituendo dal metodo main, un thread figlio termina restituendo dal metodo run.

"Qual è il modo migliore per farlo?"

"Puoi aggiungere qualche variabile, come un boolean . Se è true , il thread viene eseguito. Se è false  , il thread dovrebbe terminare. In questo modo, ad esempio:"

Codice Descrizione
class Clock implements Runnable
{
public void run()
{
while (true)
{
Thread.sleep(1000);
System.out.println("Tick");

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

La classe Clock scrive «Tick» sulla console una volta al secondo per sempre

Se ClockManager.isClockRun è false, il metodo run termina.

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;
}

}
Il thread principale avvia un thread figlio (orologio) che dovrebbe essere eseguito per sempre

Attendere 10 secondi e dare all'orologio un segnale per terminare.

Il thread principale completa il suo lavoro.

Il filo dell'orologio termina il suo lavoro.

"E se abbiamo diversi thread, allora cosa?"

"È meglio avere una tale variabile per ogni thread. È più conveniente aggiungerla direttamente alla classe. Potresti aggiungere una variabile booleana isRun lì. Tuttavia, è meglio aggiungere una variabile booleana isCancel che diventa vera se l'attività è annullato."

Codice Descrizione
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 classe Clock scrive la parola «Tick» nella console una volta al secondo finché isCancel è false.

Quando isCancel diventa true, il metodo run termina.

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

Thread.sleep(10000);
clock.cancel();
}
Il thread principale avvia un thread figlio (orologio) che dovrebbe essere eseguito per sempre

Attendi 10 secondi e  annulla l'attività chiamando il metodo cancel.

Il thread principale completa il suo lavoro.

Il filo dell'orologio termina il suo lavoro.

"Lo terrò a mente. Grazie, Ellie."