2009-05-27 3 views
2

Jungs abgeschlossen ist, stoße ich auf ein verwirrendes Problem! Ich möchte eine ausführbare JAR aufrufen, um PI aus meiner Java-Anwendung zu generieren, indem ich runtime.exec() verwende, die eine neue JVM zum Ausführen der ausführbaren JAR erstellt. Mein Problem ist, dass die JVM noch lebt, wenn die PI-Berechnung abgeschlossen ist. Meine Main-Java-Anwendung hat keine Ahnung, ob die PI-Berechnung abgeschlossen ist oder nicht. Und ich möchte auch, wenn die PI-Berechnung abgeschlossen ist, könnte die JVM heruntergefahren werden! Wie kann ich das umsetzen? Vielen Dank!!Wie zu überprüfen, ob eine ausführbare JAR in einer anderen JVM

Antwort

2

Wenn Sie Runtime.exec() aufrufen, erhalten Sie ein Process-Objekt zurück. Sie müssen dazu waitFor() anrufen.

Sie müssen auch die stdout/stderr-Streams erfassen (in separaten Threads, um eine Blockierung zu verhindern - siehe this answer für weitere Informationen).

Dies alles lässt beiseite, warum Sie dies in einer separaten JVM tun, und warum Sie nicht die relevanten Klassen in Ihre aktuelle App laden und die Bibliothek lokal ausführen können.

+0

Ja, ich verwendet waitFor(), aber ich denke, Process.waitFor() in einem anderen Thread blockiert bis die JVM beendet ist. Aber wenn ich Runtime.exec() benutze, rufen Sie eine ausführbare JAR auf, wenn JAR fertig ist, lebt die JVM noch, also blockiert die waitFor() immer! Das ist das Problem, das ich traf! Was ich mich wundere ist, wie könnte die JVM beendet werden, wenn das JAR darauf läuft? – Johnson

+0

Sammeln Sie stdout/stderr auf nicht blockierende Weise? Und führt das Ausführen des .jar Standalone zu einer Blockierung? –

+0

Eigentlich möchte ich nicht von der PI-Berechnung stdout erhalten. Ich möchte nur, dass es stand-alone läuft und das Ergebnis automatisch in einer .txt-Datei speichert, die allesamt vom JAR selbst erstellt wurde, und schließlich könnte die JVM automatisch in die Zeitzone gebracht werden, ohne die Hauptanwendung zu belästigen! – Johnson

0

Um den zweiten Teil Ihrer Frage zu beantworten, wird die JVM immer beendet, wenn noch keine Nicht-Daemon-Threads ausgeführt werden. Oder in einfacher Sprache, wenn Ihre Anwendung "fertig" ist und die main-Methode beendet wird, ohne dass Threads im Hintergrund ausgeführt werden, wird die JVM beendet.

Dies gilt unabhängig davon, ob Sie den Java-Prozess selbst von Ihrem Desktop/Befehlszeile aus starten oder über Runtime.exec() (was weitgehend äquivalent ist) auslösen. Wenn Ihre Pi-Berechnung beendet wird, wird die JVM, die Sie erzeugt haben, heruntergefahren, und wenn Ihr ursprüngliches Programm beendet ist, wird auch JVM beendet.

Obwohl ich hier völlig mit Brian übereinstimme, kann ich nicht den Vorteil sehen, eine Java - App als separaten Prozess zu betreiben, wenn man es nur in der originalen JVM ausführen kann (abgesehen von einigen wirklich ungewöhnlichen Umweltfaktoren wie Einstellung der Nettigkeit oder Prozessoraffinität der verschiedenen Prozesse).

+0

Der Grund, warum ich die PI-Berechnung in einer separaten JVM ausführe, ist, dass, wenn die PI-Berechnung keinen virtuellen Speicher mehr hat oder die JVM heruntergefahren wird, meine Hauptanwendung trotzdem funktioniert! Ich versuche eine Worker-Anwendung in einer Grid-Computing-Architektur zu erstellen!Um die Worker-Anwendung zu sichern, muss ich die Aufgabe separat ausführen :) – Johnson

0

Kontrolle, was das Glas tut, wenn man es alleine lauf, vielleicht für die Eingabe seiner Warte und dafür ist es nie verlassen

+0

Ich habe dieses JAR in der standlone JVM ausgeführt, es funktioniert und wenn es fertig ist, ist die JVM auch zeitlich begrenzt! aber wenn ich es in exec() aufrufe und process.waitFor() benutze, endet es nie! :( – Johnson

Verwandte Themen