web-dev-qa-db-fra.com

Comment arrêter un fil?

Quand un thread est en vie, comment puis-je l'arrêter? J'ai donné comme

if(thread.isAlive()){
    thread.stop();
}

mais la méthode stop est obsolète et lève une exception

01-21 14:12:40.188: ERROR/global(535):     Deprecated Thread methods are not supported.
01-21 14:12:40.188: ERROR/global(535):    Java.lang.UnsupportedOperationException
01-21 14:12:40.188: ERROR/global(535):     at Java.lang.VMThread.stop(VMThread.Java:85)
01-21 14:12:40.188: ERROR/global(535):     at Java.lang.Thread.stop(Thread.Java:1379)
01-21 14:12:40.188: ERROR/global(535):     at Java.lang.Thread.stop(Thread.Java:1344)

Comment pouvons nous résoudre ceci?

14
jennifer

En général, vous n'arrêtez pas de force les threads parce que c'est dangereux. Vous définissez un indicateur qui indique au thread en question de sortir de sa boucle de thread dans des circonstances contrôlées.

Votre boucle de thread ressemble à ceci:

void run() {
  while (shouldContinue) {
    doThreadWorkUnit();
  }
}

Et ailleurs, vous définissez la variable shouldContinue et attendez que le thread se termine:

...
thread.shouldContinue = false;
thread.join();
...

(Tout cela n’est probablement pas correct en Java, car je ne le fais pas. Affichez-le sous forme de pseudo-code et modifiez-le en fonction de votre bibliothèque de langage/thread/etc.)

37
Jakob Borg

Voici ce que les gens de Java ont à dire à propos de pourquoi ne pas appeler thread.stop et quoi faire à la place.

http://download.Oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

La réponse courte est que vous autorisez le retour de la fonction de point d’entrée de thread.

3
Sparky

Mieux vaut utiliser cette méthode de thread pour l'arrêter.

Thread.interrupt();

Pour que vous puissiez également sauvegarder l'état de thread.

2
Jay Vyas

Dans une implémentation de threads sans bouclage, vous pouvez toujours utiliser quelque chose comme ceci au tout début du code de thread comme: 

void run() {
    if (!shouldContinue) { 
       return 1; 
    } 
    .. 
    then rest of the thread code
    ..
 }
0
TheCottonSilk