Java ProcessBuilder.start()的拍摄比在终端中执行要长得多



我有一个GUI,当用户单击按钮时,启动新线程(getFilesThread)。此线程调用下面ClearCaseProcess类实例的start()方法(我的组织将不允许我使用clearcase java api),当过程(ES)结束时,它会更新GUI。

private static class ClearCaseProcess {
private ArrayList<String> stdout = new ArrayList<>();
private ArrayList<String> stderr = new ArrayList<>();
private ProcessBuilder pb = null;
public ClearCaseProcess(ArrayList<String> commands, String dir) throws IOException {
    pb = new ProcessBuilder(commands);
    pb.directory(new File(dir));
}
public void start() throws IOException {
    long minStart = System.nanoTime();
    Process process = pb.start();
    Thread sout = new Thread() {
        @Override
        public void run() {
            BufferedReader out = new BufferedReader(
                new InputStreamReader(process.getInputStream()));
            String outLine = "";
            try {
                while ((outLine = out.readLine()) != null) {
                    stdout.add(outLine);
                    System.out.println(outLine);
                }
            } catch (IOException ex) {
                System.err.println(ex.getMessage());
            }
        }
    };
    sout.start();
    Thread serr = new Thread() {
        @Override
        public void run() {
            BufferedReader err = new BufferedReader(
                new InputStreamReader(process.getErrorStream()));
            String errLine = "";
            try {
                while ((errLine = err.readLine()) != null) {
                    stderr.add(errLine);
                    System.err.println(errLine);
                }
            } catch (IOException ex) {
                System.err.println(ex.getMessage());
            }
        }
    };
    serr.start();
    try {
        process.waitFor();
        long execTime = System.nanoTime() - minStart;
        System.out.println("Process '" + description + "' took " + execTime);
    } catch (InterruptedException ex) {
        System.err.println(ex.getMessage());
    }
}
}

getFiles()需要从四个不同的ClearCaseProcess ES收集数据。我计划在四个线程中同时运行它们。这些线程中的每一个都有两个相关的辅助线程,以消耗stdoutstderr,如上所示。我假设这将比依次四次运行ClearCase要快。但是,目前,我正在测试一个通话。

我的问题是,呼叫Process.start()Process.waitFor()返回之间经过的时间比我在终端上运行相同的clearcase命令(约1.5分钟)时经过的时间更长(约5分钟)。我怀疑我的循环阅读Stdout和Stderr是罪魁祸首,因为即使我的印刷陈述也很慢,无法在Netbeans的控制台中产生输出。我该如何加快速度?

对于我的特定情况,IDE内部的运行(不调试)导致开销。

从控制台(java -jar myExecutable.jar)跑时,时间非常接近。
noobish错误。

最新更新