2014-10-06 5 views
1

У меня есть основная Java-программа, которая должна запускать другие java-программы в собственном процессе с использованием Runtime.exec(), например.Возможна ли связь с Java Runtime.exec?

Runtime.exec("java -jar myapp.jar"); 

Есть ли возможность установить связь с этим новым процессом, например. отправка запроса, chaing поля ...?

Как я могу закрыть этот новый созданный процесс? Я думаю, что получаю обработчик и, таким образом, могу убить процесс. Но есть ли лучший способ?

Если я убью процесс, будет ли процесс shutdownhook выполняться до того, как процесс будет убит?

Runtime.getRuntime().addShutdownHook 
+0

* «Если я убью процесс» * - Предполагая, что вы говорите о процессе, запущенном с помощью «Runtime.exec», тогда да, так как процесс и выключение являются двумя разными понятиями и не связаны друг с другом. Вы также можете провести некоторое исследование в «ProcessBuilder», а также – MadProgrammer

+0

+1 на «ProcessBuilder». – aioobe

ответ

1

Есть ли возможность связаться с этим новым процессом, например, отправка запроса, chaing поля ...?

Вы можете общаться с процессом через Process объекта, возвращенного Runtime.exec. Просто используйте Process.getInputStream/.getOutputStream.

Если вы хотите вызывать методы на другом Java-процессе, вы можете посмотреть в RMI («Вызов удаленного метода»). Другим вариантом является, разумеется, сокеты. См. this related answer.

Нет прямого независимого от платформы способа изменения полей другого Java-процесса.

Если я убить процесс, будет shutdownhook еще выполняться до того, как процесс будет убит?

Зависит от того, как вы убили его, но, как правило, да, выключение крючки будут выполнены.

+0

Большое спасибо, Stackoverlfow rulez. ;) Как я должен убить процесс, чтобы shutdownhook все еще выполнялся? Если я хочу завершить процесс, который я начал с Runtime.exec, это единственный способ убить процесс? – machinery

+0

Я бы рекомендовал вам запустить начатый процесс из 'System.in' и дождаться строки, содержащей' 'exit'', и после получения команды exit завершить. – aioobe

+0

Вы можете, например, добавить к следующему процессу следующее: 'new Thread() {public void run() {BufferedReader br = new BufferedReader (новый InputStreamReader (System.in)); try {while (! br.readLine(). equals ("exit")); System.exit (0); } catch (IOException e) {}}} .start(); ' – aioobe

Смежные вопросы