Non, il n'y en a pas. Votre seul choix sans sorcellerie majeure est d'appeler interrupt() et d'attendre que l'appel bloque. À ce stade, il lancera une exception InterruptedException que vous devez terminer le thread.
Si elle est dans une boucle telle que while(1);
vous ne pouvez pas vraiment faire grand chose; vous devez corriger votre thread pour ne pas le faire, ou au moins vérifier un drapeau et arrêter lui-même.
Par exemple, vous pouvez réécrire:
while(1) {
doWork();
}
comme:
class Whatever {
private volatile boolean stop = false;
...
while (!stop) {
doALittleWork();
}
...
}
Il y avait une méthode Thread.stop()
qui fait cela, mais il est dépréciée pour très, très bonnes raisons et ne devrait pas être utilisé.
EDIT: Puisque vous utilisez probablement un interprète, ce que vous devez faire est de crochet après chaque instruction est exécutée (ou si) et vérifiez votre magie variables stop
, et le cas échéant mettre fin à l'exécution Lua. Alternativement, l'exécution de Lua peut avoir son propre indicateur "terminate" que vous pouvez utiliser - J'ai cherché de la documentation mais leur site est horrible, donc vous devrez peut-être regarder le code pour cela. Au-delà, vous devrez peut-être patcher manuellement la source Lua4j pour ajouter cette fonctionnalité. Vos options sont assez limitées et finalement le Thread doit contrôler son propre destin.
Le problème est, ce n'est pas le code Java qui bloque les choses. C'est un langage de script que les utilisateurs potentiels de ce logiciel utiliseront. S'ils décident d'écrire pendant (1); et puis appuyez sur le bouton d'arrêt, je dois être capable de tuer ce fil. – Dave
+1 Bonne réponse. Les problèmes avec les threads attrapés dans des boucles infinies sont très difficiles à gérer et provoquent de gros problèmes avec la gestion des threads. Ils doivent être résolus pour que vos threads ne soient jamais dans des boucles infinies. Si les threads doivent être contrôlés de l'extérieur, vous devez mettre des contrôles par intermittence pour voir s'ils doivent s'arrêter. –
@Dave: entre chaque exécution de ligne, est-ce que le thread peut vérifier une variable d'état d'exécution, comme la variable d'arrêt booléenne de @ Steven, et quitter le thread gracieusement si elle est définie? –