2011-10-31 4 views
1

Je sais que Thread.stop() et d'autres fonctions sont obsolètes, et je veux empêcher un thread de s'exécuter si une certaine condition est remplie. Voici une version simplifiée de ce que je fais maintenant:Un thread Java peut-il être arrêté en toute sécurité en retournant dans la méthode run()?

public class SomeThread extends Thread 
{ 
    private static boolean running = true; 

    public static void shutdown() 
    { 
     running = false; 
    } 

    public void run() 
    { 
     while(running) 
     { 
      // do something cool 
     } 

     return; // <- this is what I'm wondering about 
    } 
} 

Lorsqu'un autre classe appelle la méthode shutdown() de SomeThread, les sorties de boucle while, puis la méthode retourne run(). Est-ce sûr? La principale raison pour laquelle j'utilise une boucle while au lieu de simplement laisser exécuter run() est parce qu'il y a quelques choses que je ne veux faire qu'une seule fois (avant la boucle while), et je ne suis vraiment que utiliser le thread pour la concurrence. Je suis sûr que c'est une bastardisation de ce que les Threads étaient destinés, mais je m'interroge principalement sur la déclaration de retour.

Répondre

4

Le retour est bon, le reste de votre code est incertain.

Le membre running doit être soit volatile, soit vous avez besoin d'une synchronisation autour des lectures et écritures sur cette variable.

(vu shutdown et running comme statique est inhabituel.)

+0

Je suis en train de faire de la synchronisation en ce moment (bien que le code ci-dessus ne reflète pas cela), mais en supprimant la statique et en changeant "running" en volatile soit suffisant pour garder le thread sûr? (J'essaie de me souvenir exactement pourquoi j'ai utilisé la statique dans ce contexte, je ne crois pas que ce soit nécessaire maintenant que vous l'avez souligné.) – WillP

+0

Si vous avez une synchronisation correcte, ne la supprimez pas en faveur de volatil. C'est (à mon avis) beaucoup plus délicat à utiliser correctement. – Mat

+0

D'accord avec Mat. Ou utilisez un AtomicBoolean, ce qui est encore plus facile. –

6

utiliser le mécanisme d'interruption intégré de fils à la place d'un champ

public class SomeThread extends Thread { 
    public void run() { 
     while(!isInterrupted()) { 
      // do something 
     } 
    } 
} 

D'un autre fil, appeler interrupt() sur le fil afin pour l'éteindre. Cela a l'avantage supplémentaire que cela fonctionnera même si votre thread attend sur un moniteur.

+1

Ah, merci. Ce truc de thread est un peu nouveau pour moi. Je suis plus habitué aux pthreads et aux sémaphores. Java le rend trop facile, haha. – WillP

+0

Ceci est une meilleure réponse et devrait être acceptée un! –

Questions connexes