This should be rather simple, but I don\'t see anything helpful in JavaDocs.
What I need is to run some external process from my Java code and then be able to monito
Based on the question's specific code snippet I might be useful to add that since 1.8 the Process
class has an isAlive()
method is available
Documentation link: https://docs.oracle.com/javase/8/docs/api/java/lang/Process.html
good luck to anyone reading this!
I'm not sure I'm understanding the question but one way to do this is to call process.exitValue();
. It throws an exception if process has not yet terminated:
/**
* Returns the exit value for the subprocess.
*
* @return the exit value of the subprocess represented by this
* <code>Process</code> object. by convention, the value
* <code>0</code> indicates normal termination.
* @exception IllegalThreadStateException if the subprocess represented
* by this <code>Process</code> object has not yet terminated.
*/
abstract public int exitValue();
If you don't mind a hack, you can do something like the following if you are working on a ~Unix system which uses the UNIXProcess
class. This does use reflection however:
ProcessBuilder pb = new ProcessBuilder("/bin/sleep", "5");
Process process = pb.start();
// open accessability of the UNIXProcess.hasExited field using reflection
Field field = process.getClass().getDeclaredField("hasExited");
field.setAccessible(true);
// now we can get the field using reflection
while (!(Boolean) field.get(process)) {
...
}
Start a new Thread which calls Process.waitFor()
and sets a flag when that call returns. then, you can check that flag whenever you want to see if the process has completed.
public class ProcMon implements Runnable {
private final Process _proc;
private volatile boolean _complete;
public boolean isComplete() { return _complete; }
public void run() {
_proc.waitFor();
_complete = true;
}
public static ProcMon create(Process proc) {
ProcMon procMon = new ProcMon(proc);
Thread t = new Thread(procMon);
t.start();
return procMon;
}
}
(some boilerplate omitted).