2012-04-10 22 views
1

Ich habe eine Java-Anwendung (Prinzipal), die ein ausführbares jar aufruft:Warten auf Java-Prozess beendet

Process p = Runtime.getRuntime().exec(java -jar C:\\PFC\\maestro.jar) 
p.waitFor(); 

maestro.jar ist eine Java-Anwendung, die 2 Threads erstellt, und ruft eine andere ausführbare jar (welches Verfahren Variable ist "b"). Dann warte ich für sie wie folgt aus:

b.destroy(); //kill other executable jar that is called 
    manejadora.join(); //thread finished 
    controlador.join(); //thread finished 
    System.out.println("all finished"); 

maestro.jar läuft RICHTIG und es zeigt „beendet“ auf Eclipse, wenn ich es laufen, so gibt es keine Probleme.

Wenn principal versucht, maestro.jar auszuführen, wird es korrekt ausgeführt, aber der Prinzipal wartet auf maestro.jar auf "p.waitFor()", wenn maestro.jar bereits beendet ist.

Ich verstehe nicht warum.

Können Sie mir etwas Orientierung geben? Vielen Dank!

+0

'Process.waitFor()' wahrscheinlich nicht gebrochen ist, so durch Eliminierung, ist es sehr wahrscheinlich, dass die 'java.exe' Verfahren zur maestro.jar hat schließlich in Betrieb gehalten Die Arbeit ist erledigt. Sie können dies einfach mit Process Explorer überprüfen. Wenn dies der Fall ist, müssen Sie herausfinden, warum die untergeordnete JVM nicht z. Verwenden von JVisualVM, um einen Heapspeicherauszug zu erstellen. – Barend

Antwort

3

Dies liegt möglicherweise daran, dass die Prozesse möglicherweise Inhalte auf der Konsole ausgeben, die Sie nicht in einem separaten Thread verwenden. Lesen Sie diesen Artikel für weitere Informationen:

http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

Die Apache exec Bibliothek tut all diese Dinge für Sie schön .. Verwenden Sie diese Bibliothek, Ihr Problem zu beheben ..

http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

+0

+1 für die Erwähnung von Commons-Exec. Es macht Dinge viel einfacher. – Barend

+0

Ich habe maestro.jar geändert ----> jetzt ruft es nichts mehr an und es erzeugt nicht die 2 Threads. Es zeigt nur "System.out.println (" alle abgeschlossen ");". Und ich lasse es mit Prinzipal laufen und es ist korrekt beendet. Also gibt es Zeug auf der Konsole ohne zu konsumieren (System.out.println Sätze) und es wurde korrekt beendet. – user1297810

0

Problem gelöst.

Ich musste alle "System.out.println();" Sätze.

Also musste ich ein Protokoll erstellen, um die Programmaktivität zu sehen.

Vielen Dank alle :-)

+0

Sie können Ihre eigene Antwort als gelöst markieren! –

Verwandte Themen