我一直在尝试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());
}
}
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
永远不会引发Exception,即使 sleep 值仅为1ms。 是因为sleep()
开销本身吗? 第二个
exitValue
将返回1. PS。我从Windows 7和Eclipse运行它。
最佳答案
Process.destroy()
的规范没有说明如果没有要破坏的东西会发生什么,所以逻辑上(我想)是假设没有东西要破坏的话,也没有什么可提示的。与Thread.join()
进行比较,它不仅会在线程已经结束时终止。 Thread.sleep()
需要时间。尝试增加超时值。 关于java - Process.exitValue()和Process.destroy()功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13972442/