Comment tuez-vous un java.lang.Thread
en Java?
java
multithreading
interrupt
fil volant
la source
la source
ExecutorStatus
cette question: stackoverflow.com/questions/2275443/how-to-timeout-a-threadRéponses:
Voir ce fil de Sun sur les raisons de leur dépréciation
Thread.stop()
. Il explique en détail pourquoi il s'agissait d'une mauvaise méthode et ce qui devrait être fait pour arrêter en toute sécurité les threads en général.La façon dont ils recommandent est d'utiliser une variable partagée comme indicateur qui demande au thread d'arrière-plan de s'arrêter. Cette variable peut ensuite être définie par un autre objet demandant la fin du thread.
la source
getConnection()
dejava.sql.DriverManager
. Si la connexion prend trop de temps, j'essaie de tuer le thread correspondant en appelant,Thread.interrupt()
mais cela n'influence pas du tout le thread. LesThread.stop()
travaux cependant, bien qu'oracle indique que cela ne devrait pas fonctionner sinoninterrupt()
. Je me demande comment le faire fonctionner et éviter d'utiliser une méthode obsolète.En général, vous ne le faites pas ..
Vous lui demandez d'interrompre tout ce qu'il fait en utilisant Thread.interrupt () (lien javadoc)
Une bonne explication de pourquoi est dans le javadoc ici (lien technote java)
la source
interrupt()
méthode est appelée? La question principale est liée à la génération de journaux pour chaque nouveau thread.En Java, les threads ne sont pas supprimés, mais l'arrêt d'un thread se fait de manière coopérative . Le thread est invité à se terminer et le thread peut ensuite s'arrêter correctement.
Souvent, un
volatile boolean
champ est utilisé que le thread vérifie périodiquement et se termine lorsqu'il est défini sur la valeur correspondante.Je n'utiliserais pas un
boolean
pour vérifier si le thread doit se terminer . Si vous utilisezvolatile
comme modificateur de champ, cela fonctionnera de manière fiable, mais si votre code devient plus complexe, car à la place utilise d'autres méthodes de blocage à l'intérieur de lawhile
boucle, il peut arriver que votre code ne se termine pas du tout ou du moins prend plus de temps à mesure que vous pourrait vouloir.Chaque thread a déjà un statut d'interruption booléen et vous devez l'utiliser. Il peut être implémenté comme ceci:
Code source adapté de Java Concurrency in Practice . Puisque la
cancel()
méthode est publique, vous pouvez laisser un autre thread invoquer cette méthode comme vous le souhaitez.la source
Une façon consiste à définir une variable de classe et à l'utiliser comme sentinelle.
Définissez une variable de classe externe, c'est-à-dire flag = true dans l'exemple ci-dessus. Réglez-le sur false pour «tuer» le thread.
la source
volatile
pour vous assurer qu'il fonctionne correctement partout. La classe interne n'est pas statique, l'indicateur doit donc contenir une variable d'instance. L'indicateur doit être effacé dans une méthode d'accesseur afin que d'autres opérations (comme une interruption) puissent être effectuées. Le nom "flag" n'est pas descriptif.Il existe un moyen de le faire. Mais si vous deviez l'utiliser, soit vous êtes un mauvais programmeur, soit vous utilisez un code écrit par de mauvais programmeurs. Donc, vous devriez penser à cesser d'être un mauvais programmeur ou à cesser d'utiliser ce mauvais code. Cette solution est uniquement pour les situations où il n'y a pas d'autre moyen.
la source
Thread.stop
même s'il est déconseillé.Thread.stop
fait de même mais vérifie également l'accès et les autorisations. L'utilisationThread.stop
est assez évidente, et je ne me souviens pas de la raison pour laquelle j'ai utilisé à laThread.stop0
place de cela. PeutThread.stop
- être n'a pas fonctionné pour mon cas particulier (Weblogic sur Java 6). Ou peut-être parce qu'ilThread.stop
est obsolète et provoque un avertissement.Je voudrais ajouter plusieurs observations, basées sur les commentaires qui se sont accumulés.
Thread.stop()
arrêtera un thread si le gestionnaire de sécurité le permet.Thread.stop()
est dangereux. Cela dit, si vous travaillez dans un environnement JEE et que vous n'avez aucun contrôle sur le code appelé, cela peut être nécessaire; voir Pourquoi Thread.stop est déconseillé?stop()
crée une nouvelleThreadDeathError
erreur sur le thread appelant , puis renvoie cette erreur sur le thread cible . Par conséquent, la trace de pile est généralement sans valeur.stop()
vérifie auprès du responsable de la sécurité, puis appellestop1()
cet appelstop0()
.stop0()
est du code natif.Thread.stop()
n'a pas encore été supprimé, mais aThread.stop(Throwable)
été supprimé dans Java 11. ( liste de diffusion , JDK-8204243 )la source
Je voterais pour
Thread.stop()
.Comme par exemple, vous avez une opération de longue durée (comme une demande de réseau). Soi-disant, vous attendez une réponse, mais cela peut prendre du temps et l'utilisateur a navigué vers une autre interface utilisateur. Ce thread en attente est maintenant a) inutile b) un problème potentiel car lorsqu'il obtiendra un résultat, il sera complètement inutile et il déclenchera des rappels pouvant entraîner un certain nombre d'erreurs.
Tout cela et il peut faire un traitement de réponse qui pourrait être intense en CPU. Et vous, en tant que développeur, ne pouvez même pas l'arrêter, car vous ne pouvez pas lancer de
if (Thread.currentThread().isInterrupted())
lignes dans tout le code.Donc, l'incapacité d'arrêter de force un fil est bizarre.
la source
Thread.stop()
toute façon en toute sécurité. Vous ne votez pas pourThread.stop()
, vous demandez à chaque personne qui met en œuvre toutes les opérations qui peuvent prendre un certain temps de le rendre sans danger. Et c'est peut-être une bonne idée, mais cela n'a rien à voir avec la miseThread.stop()
en œuvre comme moyen de demander l'avortement sans risque. Nous avons déjàinterrupt
pour ça.stop
.La question est assez vague. Si vous vouliez dire «comment écrire un programme pour qu'un thread cesse de fonctionner quand je le veux», alors diverses autres réponses devraient être utiles. Mais si vous vouliez dire «J'ai une urgence avec un serveur, je ne peux pas redémarrer maintenant et j'ai juste besoin d'un thread particulier pour mourir, quoi qu'il arrive», alors vous avez besoin d'un outil d'intervention pour correspondre aux outils de surveillance comme
jstack
.À cet effet, j'ai créé jkillthread . Voir ses instructions d'utilisation.
la source
Il y a bien sûr le cas où vous exécutez une sorte de code pas complètement fiable. (Personnellement, je l'ai en permettant aux scripts téléchargés de s'exécuter dans mon environnement Java. Oui, il y a des sonneries d'alarme de sécurité partout, mais cela fait partie de l'application.) Dans ce cas malheureux, vous ne faites qu'espérer en demandant aux rédacteurs de scripts pour respecter une sorte de signal booléen run / don't-run. Votre seule sécurité intégrée décente consiste à appeler la méthode d'arrêt sur le thread si, par exemple, elle s'exécute plus longtemps qu'un certain délai d'expiration.
Mais, c'est juste "décent", et non absolu, car le code pourrait intercepter l'erreur ThreadDeath (ou toute exception que vous lancez explicitement), et ne pas la renvoyer comme un thread gentleman est censé le faire. Donc, la ligne de fond est AFAIA, il n'y a pas de sécurité absolue.
la source
Il n'y a aucun moyen de tuer gracieusement un thread.
Vous pouvez essayer d'interrompre le fil, une stratégie commune consiste à utiliser une pilule empoisonnée pour envoyer un message au fil pour qu'il s'arrête
}
http://anandsekar.github.io/cancel-support-for-threads/
la source
En règle générale, vous ne tuez pas, n'arrêtez pas ou n'interrompez pas un thread (ou vérifiez s'il est interrompu ()), mais laissez-le se terminer naturellement.
C'est simple. Vous pouvez utiliser n'importe quelle boucle avec une variable booléenne (volatile) à l'intérieur de la méthode run () pour contrôler l'activité du thread. Vous pouvez également revenir du thread actif au thread principal pour l'arrêter.
De cette façon, vous tuez gracieusement un fil :).
la source
Les tentatives d'arrêt brutal des threads sont de mauvaises pratiques de programmation bien connues et la preuve d'une mauvaise conception des applications. Tous les threads de l'application multithread partagent explicitement et implicitement le même état de processus et forcés de coopérer les uns avec les autres pour le garder cohérent, sinon votre application sera sujette aux bogues qui seront vraiment difficiles à diagnostiquer. Ainsi, il est de la responsabilité du développeur de fournir une assurance d'une telle cohérence via une conception d'application soignée et claire.
Il existe deux solutions principales pour les terminaisons de threads contrôlées:
Une bonne explication détaillée des problèmes liés à la terminaison abrupte des threads ainsi que des exemples de solutions erronées et correctes pour la terminaison contrôlée des threads peuvent être trouvés ici:
https://www.securecoding.cert.org/confluence/display/java/THI05-J.+Do+not+use+Thread.stop%28%29+to+terminate+threads
la source
Voici quelques bonnes lectures sur le sujet:
Que faites-vous avec l'exception InterruptedException?
Arrêter les fils proprement
la source
Je n'ai pas réussi à faire fonctionner l'interruption sur Android, j'ai donc utilisé cette méthode, elle fonctionne parfaitement:
la source
«Tuer un fil» n'est pas la bonne expression à utiliser. Voici une façon dont nous pouvons implémenter la fin / sortie gracieuse du fil sur la volonté:
Runnable que j'ai utilisé:
La classe de déclenchement:
la source
Thread.stop est obsolète, alors comment arrêter un thread en Java?
Toujours utiliser la méthode d'interruption et l'avenir pour demander l'annulation
la source