Kann ich mit Java eine JVM spawnen lassen und dann die ursprüngliche beenden?

9

Bearbeiten: Es scheint, dass mein Test, um festzustellen, ob die ursprüngliche JVM beendet war, zunächst fehlerhaft war (siehe Kommentare zu akzeptierter Antwort). Entschuldigung für das Rauschen.

Ich brauche eine laufende JVM, um eine andere JVM zu starten und dann zu beenden. Ich versuche es gerade mit Runtime.getRuntime().exec() . Die andere JVM startet, aber meine ursprüngliche JVM wird nicht beendet, bis der "untergeordnete" JVM-Prozess beendet wird. Es scheint, dass die Verwendung von Runtime.getRuntime().exec() eine Eltern-Kind-Beziehung zwischen den Prozessen erstellt. Gibt es eine Möglichkeit, den erzeugten Prozess zu entkoppeln, sodass der übergeordnete Prozess abbrechen kann, oder einen anderen Mechanismus, um einen Prozess ohne eine Beziehung zum Erstellungsvorgang zu erzeugen?

Beachten Sie, dass dies genau wie diese Frage aussieht: Java wird verwendet, um einen Prozess zu generieren und nach dem Beenden der Parent-Funktion weiterlaufen zu lassen , aber die angenommene Antwort funktioniert nicht, zumindest nicht auf meinem System (Windows 7, Java 5 und 6). Es scheint, dass dies ein plattformabhängiges Verhalten ist. Ich suche nach einer Plattform unabhängig Möglichkeit, den anderen Prozess zuverlässig aufzurufen und meinen ursprünglichen Prozess sterben zu lassen.

Angenommen, ich besitze eine JAR-Datei unter C:\myjar.jar und möchte die Klasse com.example.RunMe ausführen, die sich in diesem JAR befindet. Nehmen wir an, die Klasse öffnet ein JOptionPane und wird beendet, sobald der Benutzer auf OK geklickt hat.

Nun folgt das folgende Programm in JVM # 1:

%Vor%

Das beobachtete Verhalten ist, dass sowohl "Launching ..." als auch "Launched JVM" gestartet wurden. werden gedruckt, aber JVM # 1 wird erst beendet, nachdem Sie in der von JVM # 2 gestarteten JOptionPane auf OK geklickt haben. Auch - das Verhalten ist das gleiche ob Sie die Stream Gobbler-Threads starten oder nicht.

Um jemandem den Atem zu ersparen, ja, ich weiß, dass ich einen neuen URLClassLoader mit dieser JAR-Datei erstellen und auf diese Weise ausführen kann, aber das ist nicht das, was ich hier versuche.

    
CarlG 09.06.2010, 20:20
quelle

4 Antworten

4

Ich habe gerade den folgenden Code ausprobiert, und ich sehe Prozesse, die auf Java und Vista laufen. Ich glaube, mit Ihrem Code könnte etwas anderes passieren.

%Vor%     
ykaganovich 09.06.2010, 20:45
quelle
0

Soweit ich weiß, tötet ein Prozess ziemlich oft alle Kinderprozesse. Ich bezweifle, dass es einen plattformunabhängigen Weg gibt, dies zu tun.

    
user308323 09.06.2010 20:22
quelle
0

Windows stellt nicht die gleiche Art von Eltern-Kind-Beziehung zwischen Prozessen her, die Unix-Systeme ausführen. Es ist wahrscheinlich, dass Ihr Elternprozess nicht beendet wird, da noch ein Thread darin läuft. Dieser Thread wartet möglicherweise darauf, dass der untergeordnete Prozess beendet wird. Dies könnte erklären, warum Ihr Elternelement beendet wird, wenn das untergeordnete Kind beendet wird.

    
Greg Hewgill 09.06.2010 20:24
quelle
0

Ihre Threads, die StreamGobblers ausführen, befinden sich in Prozess # 1 und sind keine Daemon-Threads. Daher endet Prozess # 1 erst, wenn diese Threads abgeschlossen sind, wenn die Streams, die sie verschlingen, verschwinden, wenn Prozess # 2 endet.

Nimm die zwei Zeilen heraus, die diese Threads erzeugen.

    
Stephen Denne 09.06.2010 20:48
quelle

Tags und Links