Java-Threads: Ist es möglich, einen bestimmten Thread aus einem anderen Java-Programm, das auf derselben JVM läuft, anzuzeigen / anzuhalten / zu beenden?

7

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.

    
Swanand 08.10.2008, 07:08
quelle

4 Antworten

4

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 .

    
Jaap Coomans 08.10.2008, 09:51
quelle
13

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.

    
l0st3d 17.05.2009 10:37
quelle
3

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.

    
Alexander 09.10.2008 19:29
quelle
1

Bis jetzt ist es nicht möglich, zu verschiedenen Programmen in derselben JVM zu laufen, aber einige Leute untersuchen es, um die Startzeit und die Speicher- und CPU-Nutzung verschiedener Java-Programme zu reduzieren, die auf demselben Rechner laufen.

    
Telcontar 08.10.2008 10:36
quelle

Tags und Links