Ich habe ein Programm 'foo', das verschiedene Threads ausführt, fooT1, fooT2, .. fooTn.
Wenn ich jetzt ein anderes Programm 'bar' schreiben möchte, das den Thread fooTr töten könnte, ist das möglich?
Grund: Einer der Thread fooTr verfolgt Produktlizenz. Wenn dieser Thread getötet wird; Man kann dieses Produkt unbegrenzt laufen lassen. Und "foo" selbst zu töten ist tolerierbar wie "foo", genau das wird am Ende der Lizenz gemacht.
System: Fedora-Distribution von Linux
Hinweis: Die Befehle, die JVM und das Programm foo starten, werden in /etc/init.d abgelegt und jeder, der über ausreichende Kenntnisse der rc.1 / rc.2 / rc.3 Struktur verfügt, kann die Startparameter ändern / hinzufügen diese.
Ich hoffe meine Frage ist klar. Wenn nicht, kann ich es immer bearbeiten.
Nach meinem Wissen ist es nicht möglich, dies direkt zu tun. Was Sie jedoch in Erwägung ziehen könnten, ist eine Art Service auf Ihrem 'foo' zu erstellen, der von 'bar' aufgerufen werden kann, um den Thread zu beenden. Es gibt natürlich Hunderte von Möglichkeiten, dies zu implementieren. Mein erster Gedanke wäre, dies zu tun mit RMI .
Eigentlich erlaubt Ihnen der Java-Debugger, einen Thread zu beenden, indem Sie eine Ausnahme einfügen. Ich habe gerade versucht, herauszufinden, wie ich mit dieser Funktion einen Thread töten kann, ohne den ganzen JVM auszulöschen, als ich auf diese Frage stieß. Wenn Sie den jvm mit Befehlszeilenoptionen wie:
ausführen %Vor%und verbinden Sie den Debugger mit etwas wie:
%Vor%Sie können eingeben:
%Vor%, um eine Liste der laufenden Threads abzurufen und den Befehl kill zum Beenden eines laufenden Threads zu verwenden. Das Bit, über das ich mich momentan nicht sicher bin, ist die Syntax dieses Kill-Befehls. Ich habe das Offensichtliche ausprobiert:
%Vor%und ich bekomme die Nachrichten:
%Vor%("Swank REPL Thread" ist der Thread, den ich töten möchte, und ja, ich habe versucht, ihn zuerst zu suspendieren;)
Immer noch meine Unfähigkeit, den Java-Debugger beiseite zu legen, sieht es für mich so aus, als könnte ein Thread zufällig gelöscht werden. Vielleicht können Sie einfach sicherstellen, dass Sie alle Ausnahmen ignorieren und weiterlaufen, und das reicht, aber ich bin mir nicht sicher.
Sie könnten dies auch ohne eine separate Anwendung tun. Schreiben Sie Ihre eigene Startup-Klasse, die eine Übergabe von Parametern an die ursprüngliche Startup-Klasse der Anwendung durchführt. Die Hauptmethode Ihrer Klasse würde jedoch einen Thread erstellen, der regelmäßig die Liste aller Threads überprüft (z. B. Thread.getAllStackTraces
oder Thread.enumerate
), den problematischen Thread findet und stop()
darauf aufruft. Obwohl Thread.stop
veraltet ist, funktioniert es immer noch.
Eine andere Option ist, die Anwendung unter einem Java-Debugger auszuführen, sagen wir jdb
und dann suspend / kill den benötigten Thread. Sie können dem Start der Anwendung auch Parameter hinzufügen, damit die JVM angehängt werden kann, dann jdb
an die laufende JVM anhängen und den Thread verdächtigen / töten.
Tags und Links java multithreading jvm