我一直在尝试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
,那么即使睡眠值只有 1 毫秒,第二次也不会抛出异常。是因为sleep()
开销本身吗? 第二个exitValue
将返回 1。
PS。我从 Windows 7 和 Eclipse 运行它。