Вспомогательный класс, подобный этому, сработает:
public class ProcessWatcher implements Runnable {
private Process p;
private volatile boolean finished = false;
public ProcessWatcher(Process p) {
this.p = p;
new Thread(this).start();
}
public boolean isFinished() {
return finished;
}
public void run() {
try {
p.waitFor();
} catch (Exception e) {}
finished = true;
}
}
Затем вы бы реализовали свой цикл в точности так, как описали:
Process p = Runtime.getRuntime().exec("whatever command");
ProcessWatcher pw = new ProcessWatcher(p);
InputStream output = p.getInputStream();
while(!pw.isFinished()) {
processOutput(output);
if(shouldCancel()) p.destroy();
Thread.sleep(500);
}
В зависимости от того, из каких условий вы захотите уничтожить процесс, вы можете сделать это в отдельном потоке. В противном случае вы можете заблокировать, ожидая обработки большего количества выходных данных программы, и никогда не получите возможность уничтожить его.
EDIT : Макдауэлл на 100% прав в своем комментарии ниже, поэтому я сделал готовую переменную изменчивой.