Fils Java: Est-il possible de voir / mettre en pause / tuer un fil particulier d'un autre programme Java s'exécutant sur la même machine virtuelle?

StackOverflow https://stackoverflow.com/questions/181615

  •  05-07-2019
  •  | 
  •  

Question

J'ai un programme 'foo' exécutant différents threads, fooT1, fooT2, .. fooTn.

Maintenant, si je veux écrire un autre programme 'bar', ce qui pourrait tuer le thread fooTr, est-ce possible?

Raison: l'un des threads fooTr suit la licence du produit. Si ce fil est tué; on peut utiliser ce produit indéfiniment. Et tuer "foo" est tolérable en tant que "foo", car c'est exactement ce qui est fait à l'expiration de la licence.

Système: Distribution Fedora de Linux

Remarque: Les commandes qui lancent la machine virtuelle Java et le programme foo sont placées dans /etc/init.d et toute personne ayant une connaissance suffisante de la structure rc.1 / rc.2 / rc.3 peut modifier / ajouter les paramètres de départ à ceux-ci.

J'espère que ma question est claire. Sinon, je peux toujours le modifier.

Était-ce utile?

La solution

À ma connaissance, il n’est pas possible de le faire directement. Cependant, vous pouvez envisager de créer un type de service sur votre "foo" qui peut être appelé depuis "bar" pour tuer le fil. Bien sûr, il existe des centaines de façons de mettre en œuvre cela. Ma première pensée serait de le faire en utilisant RMI .

Autres conseils

En réalité, le débogueur Java vous permettra de tuer un thread en y injectant une exception. J'essayais juste de comprendre comment utiliser cette fonctionnalité pour tuer un fil de discussion sans effacer tout le texte, lorsque je suis tombé sur cette question. Si vous exécutez jvm avec des options de ligne de commande telles que:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888 your.app.Main

et connectez le débogueur avec quelque chose comme:

jdb -attach 127.0.0.1:8888

vous pouvez taper:

threads

pour obtenir une liste des threads en cours d'exécution et utilisez la commande kill pour tuer un thread en cours d'exécution. Le bit dont je ne suis pas encore sûr est la syntaxe de cette commande kill, j'ai essayé l'évidence:

kill 0xe2e new java.lang.IllegalArgumentException("er");

et je reçois les messages:

killing thread: Swank REPL Thread
Thread not suspended
Expression must evaluate to an object

("Swank REPL Thread" est le fil que je veux tuer et oui, j'ai déjà essayé de le suspendre;)

Malgré mon incapacité à utiliser le débogueur Java, il me semble qu’un fil peut être tué au hasard. Peut-être pouvez-vous simplement vous assurer d'ignorer toutes les exceptions et de continuer à fonctionner, ce sera suffisant, mais je n'en suis pas sûr.

Vous pouvez le faire même sans application distincte. Écrivez votre propre classe de démarrage, qui transmet les paramètres à la classe de démarrage d'origine de l'application. La méthode principale de votre classe créerait cependant un thread qui vérifie périodiquement la liste de tous les threads (par exemple, Thread.getAllStackTraces ou Thread.enumerate ), trouve le thread en cause et appelle stop () dessus. Bien que Thread.stop soit obsolète, cela fonctionne toujours.

Une autre option consiste à exécuter l'application sous un débogueur Java, par exemple, jdb , puis à suspendre / supprimer le thread requis. Vous pouvez également ajouter des paramètres au démarrage de l'application pour pouvoir connecter la machine virtuelle, puis associer jdb à la machine virtuelle en cours d'exécution et suspecter / tuer le thread.

Jusqu'à présent, il n'était pas possible d'exécuter différents programmes dans la même machine virtuelle, mais certaines personnes l'étudient, afin de réduire le temps de démarrage, l'utilisation de la mémoire et du processeur de différents programmes java exécutés sur la même machine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top