Создание нескольких процессов с использованием построителя процессов из Java

Я разрабатываю веб-приложение, в котором я использую Java в качестве интерфейса и оболочку в качестве серверной части. Я обрабатываю много файлов в оболочке ... например, если мне нужно обработать 100 файлов. Я планирую создать 4 подпроцесса из Java-приложения. Я читал о Process Builder. Но у меня нет четкого представления о том, как использовать метод start () для создания нескольких процессов, а затем ждать их всех, пока это не будет выполнено, и снова продолжить обработку. Любые идеи относительно этого были бы мне очень полезны. Спасибо.


person NandaKumar    schedule 22.07.2012    source источник


Ответы (1)


Вообще говоря, start позвонит Runtime.exec(...) от вашего имени.

После запуска (выключенного в собственном маленьком процессе) вы можете взаимодействовать с ним через потоки ввода и вывода процессов.

В своей работе я отслеживаю потоки ввода и ошибок. Я делаю это, создавая новый поток для каждого потока, контролирую пропускную способность с помощью метода stream.read() и ищу возвращаемый результат -1, чтобы определить, когда потоки завершились.

Я использую третий поток «монитора», который используется для обеспечения функции «waitFor» и помощи в очистке потоковых потоков.

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

Если вы хотите дождаться завершения процесса, вы должны использовать Process.waitFor() (процесс возвращается вам методом ProcessBuilder.start()). Это будет ждать завершения процесса. Этот метод вернет код выхода для процесса, который может быть полезен для ответа на ошибки, о которых процесс может захотеть сообщить вам.

Ладно, короче ...

ProcessBuilder pb = new ProcessBuilder(new String[] {cmd, parameter1, parameter2, ...});
Process process = pb.start();

InputStream is = process.getInputStream();
InputStream isErr process.getErrorStream();

// Spawn some threads to process the streams

int exitValue = process.waitFor();

if (exitValue == 0) {

    System.out.println("All is good with the world");

} else {

    // Handle error     

}
person MadProgrammer    schedule 22.07.2012
comment
Спасибо за вашу помощь .. Теперь моя проблема в том, что у меня есть сценарий awk внутри сценария оболочки, который я вызываю ... Дело в том, что этот сценарий awk не выполняется, когда я вызываю сценарий оболочки. проблема ... - person NandaKumar; 23.07.2012