2010-09-27 6 views
3

J'ai créé une application Java et j'ai un thread qui fait quelque chose en arrière-plan quand un bouton est pressé. Le problème est que ce thread peut se bloquer, peut-être en raison d'une boucle infinie. Y a-t-il un moyen de forcer la fin de ce thread?Terminer le thread qui ne répond pas

EDIT: J'utilise LuaJ sur la plate-forme Java. Il a le potentiel de se verrouiller et je n'ai pas vraiment de contrôle dessus, à part le lancer dans un autre thread et le tuer quand java ou le script est fini.

Répondre

6

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.

+1

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

+0

+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. –

+2

@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? –

0

Enfin avec la sortie de Java V5.0 (ou V1.5), qui intègre java.util.concurrent, une réponse définitive peut être donnée. La réponse est que vous arrêtez un thread en utilisant interrupt().

+0

Oui, Steven a déjà dit cela comme l'une des options. Cela ne sert à rien si le thread n'exécute pas de code qui lancerait cette exception, cependant. –

+1

En fait, 'Thread.interrupt()' a toujours été là, et sa sémantique n'a pas beaucoup changé depuis les premiers jours.Comme Steven l'a souligné, cela n'aidera pas si le thread n'effectue aucune attente de blocage ou vérifie explicitement avec 'isInterrupted()'. – Grodriguez