gpt4 book ai didi

Java ProcessBuilder.start() 比在终端中执行花费的时间要长得多

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:12:15 24 4
gpt4 key购买 nike

我有一个 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 收集数据。我计划在四个线程中同时运行这些。这些线程中的每一个都有两个关联的辅助线程来使用 stdoutstderr,如上所示。我假设这比连续四次运行 ClearCase 更快。不过,目前我只测试一个 ClearCase 调用。

我的问题是调用 Process.start()Process.waitFor() 返回之间的时间比当我在终端上运行相同的 ClearCase 命令时耗时(大约 1.5 分钟)。我怀疑我的循环读取 stdout 和 stderr 是罪魁祸首,因为即使我的打印语句在 NetBeans 的控制台中生成输出也很慢。我怎样才能加快速度?

最佳答案

对于我的具体情况,在 IDE 内运行(而非调试)会导致开销。

从控制台(java -jar myExecutable.jar)运行时,时间非常接近。
愚蠢的错误。

关于Java ProcessBuilder.start() 比在终端中执行花费的时间要长得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42534356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com