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.
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
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
D'accord avec Mat. Ou utilisez un AtomicBoolean, ce qui est encore plus facile. –