Первый шаг, чтобы представить работу каждого подпроцесса как Future, например, так:
final ProcessBuilder builder = ...;
// for each process you're going to launch
FutureTask task = new FutureTask(new Callable<Integer>() {
@Override public Integer call() {
return builder.start().waitFor();
}
};
Теперь представить все задачи исполнителя:
ExecutorService executor = Executors.newCachedThreadPool();
for (FutureTask task : tasks) {
executor.submit(task);
}
// no more tasks are going to be submitted, this will let the executor clean up its threads
executor.shutdown();
Теперь использовать отличную ExecutorCompletionService класс:
ExecutorCompletionService service = new ExecutorCompletionService(executor);
while (!executor.isTerminated()) {
Future<Integer> finishedFuture = service.take();
System.out.println("Finishing process returned " + finishedFuture.get());
}
Этот цикл будет повторяться один раз накануне когда он заканчивается. returnValue
будет кодом выхода дочернего процесса.
Теперь вы точно не знаете, какой процесс завершился. Вы можете изменить Callable вместо того, чтобы возвращать Integer, чтобы просто вернуть Process или даже лучше ваш собственный класс, представляющий результат процесса.
О, и, конечно, если вы не заботитесь о ожидании всех задач, вы можете просто позвонить take()
один раз.
Нет такой вещи, как простая обертка JNI. :) – sjr
Понятие о том, что использование JNI должно быть вызвано здесь, кажется явно странным, также простите мое невежество, но я не знал, что такое «какая-то форма IPC», ваш ответ ничего не сделал, чтобы сообщить мне, и даже быстрый google didn ' t помочь. Извините, я не очень часто спускаюсь вниз, но это действительно не кажется мне полезным. – PeterT