为什么Java.lang.Process不会在此代码中抛出InterruptedException?

时间:2015-12-18 14:58:37

标签: java process timeout processbuilder interrupted-exception

此方法使用ProcessBuilder通过我的Java应用程序运行外部C程序。 我已将其设置为等待1000毫秒。 我传递了一个进入无限循环的代码。 但是这个过程永远不会抛出interruptException。

    public void execute(String sourceFileName, long timeout,String inputFile,String outputFile,String errorFile) 
            throws IOException, InterruptedException
    {
        ProcessBuilder builder=new ProcessBuilder(sourceFileName+executableFileExtension);
        Process process=builder.start();
        process.waitFor(timeout,TimeUnit.MILLISECONDS);
    }   

我还注意到该方法返回控件但该进程在后台继续运行。 为什么会这样?

2 个答案:

答案 0 :(得分:3)

来自Documentation of Process

  

返回:   如果子进程已退出,则返回true;如果在退出子进程之前等待时间已过,则返回 false

因此,您应该检查InterruptedException的返回值。

答案 1 :(得分:1)

方法返回控件但进程仍在后台运行 - 因为您已指定超时限制,到那时,您的C程序尚未完成。你自己说它是一个无限循环。

我传递了一个进入无限循环的代码。但是这个过程永远不会抛出interruptException。

  

WAITFOR()

文档说明

  

抛出:       InterruptedException - 如果当前线程在等待时被另一个线程中断,则等待结束并且等待   抛出InterruptedException。

您当前的线程不会被任何其他线程中断,因此它不会抛出InterruptedException。

您的计划行为似乎并不错误。