« 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 |
---|---|
|
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. |
|
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 |
---|---|
|
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. |
|
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. »
GO TO FULL VERSION