gpt4 book ai didi

java - 在 Java 中多次运行命令行程序 - 这是正确的吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:27:32 28 4
gpt4 key购买 nike

我有一个程序(在 Java 中)需要在执行期间使用不同的参数多次使用另一个程序。它是多线程的,除了在执行期间调用该程序外还需要做其他事情,所以我需要使用 Java 来完成。

问题是,所有 Runtime.exec() 调用似乎都是由 Java 以同步方式完成的,因此线程的瓶颈不是围绕函数本身,而是在 Java 调用中。因此,我们有一个运行速度非常慢的程序,但不会在任何系统资源上造成瓶颈。

为了解决这个问题,我决定不关闭进程,并使用这个脚本进行所有调用:

#!/bin/bash

read choice
while [ "$choice" != "end" ]
do
$choice
read choice
done

所有之前的 exec 调用都被替换为:

private Process ntpProc;

Initializer(){
try {
ntpProc = Runtime.getRuntime().exec("./runscript.sh");
} catch (Exception ex) {
//Error Processing
}
}

public String callFunction(String function) throws Exception e{
OutputStream os = ntpProc.getOutputStream();
String result = "";
os.write((function + "\n").getBytes());
os.flush();
BufferedReader bis = new BufferedReader(new InputStreamReader(ntpProc.getInputStream()));
int timeout = 5;
while(!bis.ready() && timeout > 0){
try{
sleep(1000);
timeout--;
}
catch (InterruptedException e) {}
}
if(bis.ready()){
while(bis.ready()) result += bis.readLine() + "\n";
String errorStream = "";
BufferedReader bes = new BufferedReader(new InputStreamReader(ntpProc.getErrorStream()));
while(bes.ready()) errorStream += bes.readLine() + "\n";
}
return result;
}

public void Destroyer() throws exception{
BufferedOutputStream os = (BufferedOutputStream) ntpProc.getOutputStream();
os.write(("end\n").getBytes());
os.close();
ntpProc.destroy();
}

效果非常好,实际上将我的程序性能提高了十倍。所以,我的问题是:这是正确的吗?还是我遗漏了一些以这种方式做事最终会导致一切都变得非常糟糕的事情?

最佳答案

如果你想从进程错误和输入流(又名 stderr 和 stdout)中读取,你需要在专用线程上完成这项工作。

主要问题是您需要在缓冲区填满时清空缓冲区,而且您只能在单独的线程上执行此操作。

你所做的,你已经设法缩短了输出,所以它不会溢出这些缓冲区,但潜在的问题仍然存在。

另外,从以往的经验来看,Java调用外部进程非常慢,所以你的方法可能会更好。

关于java - 在 Java 中多次运行命令行程序 - 这是正确的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4166923/

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