« Bonjour, Amigo ! Voici une question intéressante que tu t'es peut-être déjà posée ou que tu te poseras bientôt. Comment arrêter un thread en cours d'exécution ?"

Disons que l'utilisateur demande au programme de 'télécharger un fichier sur Internet'. Le thread principal crée un thread enfant séparé pour cette tâche, et lui passe un objet dont la méthode run contient toutes les actions nécessaires pour télécharger le fichier.

Mais tout à coup, l'utilisateur change d'avis. Il ne veut plus télécharger le fichier. Comment annuler la tâche et arrêter le thread ?

« Oui, comment on fait ? »

« On ne peut pas. C'est la réponse la plus courante et la plus juste. Tu ne peux pas arrêter un thread. Seul lui peut s'arrêter lui-même. »

Mais tu peux envoyer un signal à un thread, pour lui dire d'une certaine façon que sa tâche ne doit plus être effectuée et qu'il doit se terminer. Tout comme le thread principal se termine en sortant de la méthode main, un thread enfant se termine par un retour de la méthode run.

« Quelle est la meilleure façon de le faire ? »

« Tu peux ajouter une variable, comme un boolean. S'il a la valeur true, le thread continue. S'il a la valeur false, le thread doit se terminer. Prenons cet exemple : »

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

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

La classe Clock écrit 'Tic' dans la console une fois par seconde indéfiniment

Si ClockManager.isClockRun est false, la méthode run se termine.

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

}
Le thread principal démarre un thread enfant (l'horloge) qui doit s'exécuter indéfiniment

Attends 10 secondes avant d'envoyer à l'horloge un signal de fin.

Le thread principal termine son travail.

Le thread d'horloge termine son travail.

« Et si nous avons plusieurs threads, on fait comment ? »

« Il est préférable d'avoir une variable pour chaque thread. Le plus commode est de l'ajouter directement à la classe. Tu peux ajouter une variable boolean isRun ici. Cependant, il est préférable d'ajouter une variable boolean isCancel qui prend la valeur true si la tâche est annulée. »

Code Description
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 écrit le mot 'Tic' dans la console une fois par seconde tant que isCancel a la valeur false.

Quand isCancel devient true, la méthode run se termine.

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

Thread.sleep(10000);
clock.cancel();
}
Le thread principal démarre un thread enfant (l'horloge) qui doit s'exécuter indéfiniment

Attends 10 secondes et  annule la tâche en appelant la méthode cancel.

Le thread principal termine son travail.

Le thread d'horloge termine son travail.

« Je garderai ça à l'esprit. Merci, Ellie. »