Запустите Java Runtime Process в фоновом режиме

Я пишу Java-приложение, в котором мне нужно запускать процесс в фоновом режиме на протяжении всего срока службы работающего приложения.

Вот что у меня есть:

Runtime.getRuntime().exec("..(this works ok)..");
Process p = Runtime.getRuntime().exec("..(this works ok)..");
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

Итак, в основном я распечатываю каждые br.readLine().

В чем я не уверен, так это в том, как реализовать этот код в моем приложении, потому что, куда бы я его ни поместил (с помощью Runnable), он блокирует выполнение другого кода (как и ожидалось).

Я использовал Runnable, Thread, SwingUtilities, и ничего не работает...

Любая помощь будет принята с благодарностью :)


person phillyville    schedule 14.09.2010    source источник


Ответы (1)


Вы можете прочитать входной поток (т.е. br.readLine()) в потоке. Таким образом, он всегда работает в фоновом режиме.

То, как мы реализовали это в нашем приложении, примерно такое, как показано ниже:

Бизнес-логика, то есть место, где вы вызываете скрипт:

// Did something...

InvokeScript.execute("sh blah.sh"); // Invoke the background process here. The arguments are taken in processed and executed.

// Continue doing what you were doing

InvokeScript.execute() будет выглядеть примерно так:

InvokeScript.execute(String args) {
// Process args, convert them to command array or whatever is comfortable

Process p = Runtime.getRuntime().exec(cmdArray);

ReaderThread rt = new ReaderThread(p.getInputStream());
rt.start();
}

ReaderThread должен продолжать чтение вывода запущенного вами процесса, пока он длится.

Обратите внимание, что приведенное выше является только псевдокодом.

person pavanlimo    schedule 14.09.2010
comment
Спасибо, pavanlimo, любые советы о том, когда и где запускать Process = Runtime.getRuntime().exec(? - person phillyville; 14.09.2010
comment
Большое спасибо pavanlimo, я протестировал код в браузере, и он работает как шарм, но на самом деле я ищу что-нибудь для настольного приложения Java. Знаете ли вы эквивалент InvokeScript и ReaderThread в Java? - person phillyville; 14.09.2010
comment
@phillyville, если это еще не ясно, ReaderThread и InvokeScript должны быть вашими собственными классами Java. :) - person pavanlimo; 14.09.2010
comment
Да, я так и понял :) Я создал новый класс Thread, чтобы выполнить эту работу. Еще раз спасибо! - person phillyville; 14.09.2010