Arrêter l'exécution d'un thread à un moment arbitraire est une chose dangereuse, puisque cela peux laisser des objets dans un état inconsistant. C'est pourquoi d'ailleurs la méthode Thread.stop()) a depuis longtemps été décrétée obsolète ("deprecated").
Pour éviter une telle situation, il faut prévoir dans le thread un ou des endroits précis où il peut arrêter son exécution sans danger. On y parvient à l'aide d'un drapeau ("flag") pouvant être modifié à l'extérieur du thread et dont ce dernier vérifie régulièrement la valeur.
Dans l'exemple suivant, un thread secondaire fait son travail en vérifiant régulièrement à un endroit précis du code s'il doit s'arrêter :
import java.util.Random; public class TueurDeThreads implements Runnable { public boolean finDemandee = false; // le drapeau // thread secondaire public void run() { do { System.out.print("Je "); System.out.print("suis "); System.out.print("un "); System.out.println("thread."); // on suppose qu'il est sécuritaire d'arrêter le thread // à cet endroit } while (!finDemandee); } public static void main(String args[]) { TueurDeThreads t = new TueurDeThreads(); // création et lancement du thread secondaire new Thread(t).start(); try { // pause aléatoire de 1 à 5 secondes Thread.sleep(new Random().nextInt(5000) + 1000); } catch (InterruptedException ie) { } // demande d'arrêt du thread secondaire t.finDemandee = true; } }
En conclusion, on ne doit pas arrêter un thread de l'extérieur, mais plutôt lui demander de s'arrêter de lui-même pour qu'il le fasse à un moment où l'opération est sans danger.