Nik*_*sov 8 java windows process processbuilder
我一直在尝试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());
}
}
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
exitValue永远不会抛出异常,即使睡眠值仅为1ms.是因为sleep()开销本身吗?
第二个exitValue会返回1.PS.我从Windows 7和Eclipse运行它.
为什么会显示出问题呢?您正试图破坏一个已经被破坏的进程。的规范并Process.destroy()没有说明如果没有什么可以破坏的话会发生什么,所以(我想)假设如果没有什么可以破坏,那么就没有什么可抱怨的。与 相比Thread.join(),如果线程已经结束,它不会直接死亡。
终止进程的唯一方法是向其发送信号。在某些操作系统上,还有其他更“暴力”的方法(例如,在某些平台上,可以简单地从操作系统的正在运行的进程列表中删除该进程。结果是未定义的,并且通常会以丑陋的方式结束),但至少据我所知,平台的关键在于发送信号。
事实上,这可能是因为调用Thread.sleep(). 尝试增加超时值。
| 归档时间: |
|
| 查看次数: |
20365 次 |
| 最近记录: |