我一直在尝试使用Process和ProcessBuilder来配合这个SSCCE.
import java.io.IOException;
public class TestProcess {
public static void main(String[] args) {
Process process = null;
ProcessBuilder pb = new ProcessBuilder("notepad.exe");
try {
process = pb.start();
} catch (IOException e) {e.printStackTrace();}
//have some time to close notepad
try {
Thread.sleep(10*1000);
} catch (InterruptedException ignored) {}
try {
System.out.println(process.exitValue());
} catch (IllegalThreadStateException e) {
System.out.println(e);
}
if (process != null)
process.destroy();
/*try {
Thread.sleep(0, 1);
} catch (InterruptedException ignored) {}*/
System.out.println(process.exitValue());
}
}
>如果我在10秒超时之前运行此代码并关闭记事本. destroy()调用在尝试停止已经终止的进程时没有显示任何问题.为什么?
>如果运行此代码并且根本不关闭记事本(使用注释的第二次睡眠)
似乎destroy是异步调用(只发送一个信号?),导致第二个exitValue()异常
java.lang.IllegalThreadStateException: process has not exited
Exception in thread "main" java.lang.IllegalThreadStateException: process has not exited
at java.lang.ProcessImpl.exitValue(ProcessImpl.java:246)
at TestProcess.main(TestProcess.java:30)
>如果我运行此代码并且根本没有关闭记事本(使用未注释的第二次休眠),则第二个exitValue永远不会抛出异常,即使睡眠值仅为1ms.是因为sleep()开销本身?
第二个exitValue将返回1.
PS.我从Windows 7和Eclipse运行它.