使用Java ProcessBuilder

时间:2018-01-22 14:32:49

标签: java multithreading asynchronous

java代码需要控制外部应用程序:启动应用程序,等待应用程序完成并读取获得的结果(写入文本文件)。 我尝试过使用ProcessBuilder:

public class ExecuteNastran {
    public static void main(String argv[]) {
        List<String> command = new ArrayList<String>();
        command.add("C:\\MSC.Software\\MSC.Nastran\\bin\\nastranw.exe");
        command.add("C:\\Users\\user\\Desktop\\BRUTE-FORCE\\FLAP-TEST-SOL101-TEST-CORRELATION.bdf");
        try {
            ProcessBuilder builder = new ProcessBuilder(command);
            builder.directory(new File("C:\\Users\\user\\Desktop\\BRUTE-FORCE\\"));
            Process p = builder.start();
            p.waitFor(); //Returns inmediatly
            //Process the results which is a text file
        }
        catch (Exception err) {
            err.printStackTrace();
            }
    }
}

waitFor方法的API文档说:

*

  

public abstract int waitFor()throws InterruptedException导致   当前线程等待,如果有必要,直到表示的进程   此Process对象已终止。如果,此方法立即返回   子进程已经终止。如果子进程还没有   终止后,调用线程将被阻塞,直到子进程   退出。返回:由此表示的子进程的退出值   过程对象。按照惯例,值0表示正常   终止。

*

问题是进程p返回0(正常终止)inmediaty,而extrenal应用程序(在这种情况下是MSC Nastran)仍在运行。

https://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html?page=2中显示的解决方案是关于从外部进程读取流,但我的目的是读取外部进程完成后生成的文件。

0 个答案:

没有答案