我有以下代码:
Process proc;
try
{
ProcessBuilder procBuilder = new ProcessBuilder(/* some args */);
proc = procBuilder.start();
if (proc.waitFor(30000, TimeUnit.MILLISECONDS))
{
//Etc...
}
else
{
//Handle it
}
}
catch (InterruptedException ie)
{
currentThread().interrupt();
}
finally
{
//What goes here?
}
我试图找到一些指示是否需要调用proc.destroy()
的源(在调用destroy之前我应该检查isAlive()
并手动关闭其输入/输出/错误流,无济于事。据我所知,甚至官方文档都没有明确说明这一点。
完成衍生过程后,执行这些操作是否有必要,甚至只是一个好习惯?
答案 0 :(得分:2)
在finally块中调用process.destroyForcibly()
是个好主意。 waitFor
不会在超时之前完成,因此不会杀死该进程,因此在无限期挂起生成的进程的情况下,如果不杀死它,则它可能永远存在。
另一个用例是假设您的过程大约需要25秒才能正常终止。假设您的线程在启动后几乎立即被中断。最好终止进程,而不要一直保持进程运行,因为结果永远不会被使用。
关于流,请参见Properly closing Java Process InputStream from getInputStream