Threads Java: est-il possible d'afficher/mettre en pause/supprimer un thread particulier d'un programme java différent tournant sur le même JVM?

j'ai un programme 'foo' avec différents threads, fooT1, fooT2, .. fooTn.

maintenant si je veux écrire une autre 'barre' de programme, qui pourrait tuer le pied de fil, est-ce possible?

raison: L'un des fils fooTr pistes licence de produit. Si ce fil est tué; on peut exécuter ce produit indéfiniment. Et tuer " foo "lui-même est tolérable comme" foo " car c'est exactement ce qui se fait à l'expiration de la licence.

système: Fedora Distribution de Linux

Note: les commandes qui démarrent JVM et program foo sont placées dans /etc/init.d et toute personne ayant une bonne connaissance du rc.1 / rc.2 / rc.3 la structure peut changer/ajouter les paramètres de départ à ceux-ci.

j'espère que ma question est claire. Si pas, je peux toujours le modifier.

7
demandé sur Swanand 2008-10-08 11:08:04

4 réponses

À ma connaissance, il n'est pas possible de le faire directement. Ce que vous pourriez envisager est cependant de créer une sorte de service sur votre 'foo' qui peut être appelé à partir de 'bar' pour tuer le fil. Il y a, bien sûr, des centaines de façons de mettre cela en œuvre. Ma première pensée serait de faire cela en utilisant RMI .

4
répondu Jaap Coomans 2017-05-23 10:24:12

en fait le débogueur java vous permettra de tuer un thread en lui injectant une exception. J'essayais juste de trouver comment utiliser cette fonctionnalité pour tuer un thread sans effacer toute la jvm, quand j'ai rencontré cette question. Si vous lancez la jvm avec des options en ligne de commande comme:

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

et connecter le débogueur avec quelque chose comme:

jdb -attach 127.0.0.1:8888

vous pouvez taper:

threads

pour obtenir un liste des threads en cours d'exécution, et d'utiliser la commande kill pour tuer un thread en cours d'exécution. Le point sur lequel je ne suis pas sûr actuellement est la syntaxe de cette commande kill, j'ai essayé l'évident:

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 Fil" est le fil que je veux tuer, et oui, j'ai essayé de suspension ;)

Toujours mon incapacité à utiliser le débogueur java côté, il me ressemble un thread peut être tué au hasard. Peut-être que tu peux juste t'assurer d'Ignorer toutes les exceptions et de continuer à courir et ça suffira, mais je ne suis pas sûr de ça.

13
répondu l0st3d 2009-05-17 10:37:05

vous pouvez faire cela même sans une demande séparée. Écrivez votre propre classe de démarrage, qui effectue un passage des paramètres à la classe de démarrage originale 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 offensant, et invoque stop() sur elle. Bien que Thread.stop soit déprécié, il fonctionne toujours.

une autre option est de exécutez L'application sous un débogueur Java, par exemple jdb , puis suspendez/désactivez le thread requis. Vous pouvez également ajouter des paramètres au démarrage de l'application pour que la JVM puisse être attachée, puis attacher jdb à la JVM en cours d'exécution et soupçonner/tuer le thread.

3
répondu Alexander 2008-10-09 21:37:13

Jusqu'à présent il n'est pas possible d'exécuter des programmes différents dans la même JVM, mais certaines personnes l'examinent, afin de réduire le temps de démarrage et l'utilisation de la mémoire et du cpu des différents programmes java tournant dans la même machine.""

1
répondu Telcontar 2008-10-08 10:36:57