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
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.
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).
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
Kontrolle, was das Glas tut, wenn man es alleine lauf, vielleicht für die Eingabe seiner Warte und dafür ist es nie verlassen
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
- 1. JVM Öffnen einer anderen JVM mit einer anderen Datei.encondenning
- 2. Überprüfen, ob eine ausführbare Datei im Windows-Pfad existiert
- 3. Wie man JVM Ignorieren Jar Signaturen
- 4. Externe Eigenschaftendatei für eine ausführbare Jar
- 5. BeanDefinitionParsingException in ausführbare JAR-Datei
- 6. ausführbare jar Konnte Hauptklasse
- 7. Wie Spring Boot über ausführbare jar zu verstehen
- 8. Überprüfen, ob die JAR-Datei geladen ist?
- 9. Überprüfen, ob Ressource in einer anderen Anwendung in Delphi existiert
- 10. Wie zu überprüfen, ob eine Webseite
- 11. Wie erstellt man programmgesteuert eine ausführbare JAR-Datei aus Quellcode?
- 12. Ant: Überprüfen Sie, ob die Klasse in einem Jar existiert
- 13. Wie Spring-Boot-ausführbare JAR-Standard-Log-Datei zu deaktivieren?
- 14. meisten allgemeine Möglichkeit zu überprüfen, ob ich eine Klasse in einer anderen
- 15. wie JRE angeben, um eine ausführbare jar auszuführen
- 16. Erstellen Sie ausführbare Jar mit Einstiegspunkt in einem eingebetteten Jar
- 17. Wie man eine ausführbare jar mit Abhängigkeit jars
- 18. eclipselink PersistenceUnitLoadingEception in ausführbare Datei JAR
- 19. Überprüfen Sie, ob eine Klasse eine Unterklasse einer anderen Klasse in Java ist
- 20. Wie kann ich überprüfen, ob eine Datei in einer anderen Domäne mit Javascript existiert
- 21. Beeinflusst die Größe einer JAR-Datei die Leistung der JVM?
- 22. Überprüfen Jar Unterzeichner
- 23. Wie zu überprüfen, ob eine Domain bereits in SWF existiert
- 24. Wie zu überprüfen, ob es eine Dezimalstelle in Textfeld gibt
- 25. Überprüfen Sie, ob eine Nummer gehört zu einer Liste
- 26. Wie man Feder-basierte ausführbare jar mit Maven erstellen?
- 27. SQL Überprüfen Sie, ob Spalte String einer anderen Spalte ist
- 28. Überprüfen Sie, ob IFrame auf einer anderen Website Embeded
- 29. Überprüfen Sie, ob eine Liste alle Elemente aus einem anderen
- 30. Überprüfen Sie, ob die Datei auf einer anderen Website existiert
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
Sammeln Sie stdout/stderr auf nicht blockierende Weise? Und führt das Ausführen des .jar Standalone zu einer Blockierung? –
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