是否需要手动销毁并关闭java.lang.Process的开放流?
我有以下代码:是否需要手动销毁并关闭java.lang.Process的开放流?,java,Java,我有以下代码: Process proc; try { ProcessBuilder procBuilder = new ProcessBuilder(/* some args */); proc = procBuilder.start(); if (proc.waitFor(30000, TimeUnit.MILLISECONDS)) { //Etc... } else { //Handle it
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()
),并手动关闭其输入/输出/错误流,但没有用。据我所知,即使是官方文件也没有明确说明这一点
当我完成生成的进程时,执行这些操作是否有必要,甚至只是良好的实践?最好在finally块中调用
process.destroy()
waitFor
如果进程没有在超时之前完成,则不会终止该进程,因此在生成的进程无限期挂起的情况下,如果不终止该进程,则它可能会永久保留
另一个用例是假设您的流程正常终止大约需要25秒。假设线程在启动后几乎立即中断。最好是终止进程,而不是让它一直运行,因为结果无论如何都不会被使用
至于流,请参见,您当然应该关闭流程的输出流。否则,它可能会阻止在其
stdin
上等待流结束。如果进程生成输出,则需要对其执行一些操作。如果您不关心输出,请使用procBuilder.inheritIO()代码>(在启动进程之前)使其显示在与Java程序输出相同的位置。