是否需要手动销毁并关闭java.lang.Process的开放流?

时间:2020-06-29 21:47:54

标签: java

我有以下代码:

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()并手动关闭其输入/输出/错误流,无济于事。据我所知,甚至官方文档都没有明确说明这一点。

完成衍生过程后,执行这些操作是否有必要,甚至只是一个好习惯?

1 个答案:

答案 0 :(得分:2)

在finally块中调用process.destroyForcibly()是个好主意。 waitFor不会在超时之前完成,因此不会杀死该进程,因此在无限期挂起生成的进程的情况下,如果不杀死它,则它可能永远存在。

另一个用例是假设您的过程大约需要25秒才能正常终止。假设您的线程在启动后几乎立即被中断。最好终止进程,而不要一直保持进程运行,因为结果永远不会被使用。

关于流,请参见Properly closing Java Process InputStream from getInputStream