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

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

1 ответ

Решение

Вообщем, начну звонить Runtime.exec(...) от вашего имени.

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

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

Я использую третий поток "monitor", который используется для обеспечения функциональности "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     

}
Другие вопросы по тегам