Java 子进程中的高CPU负载
我正在开发一个java程序,它使用Java 子进程中的高CPU负载,java,processbuilder,Java,Processbuilder,我正在开发一个java程序,它使用ProcessBuilder运行批处理文件 public class Test { public static void main(String[] args){ try { ProcessBuilder processBuilder = new ProcessBuilder("pathToMyBatch.bat"); Process process = processBuilder.st
ProcessBuilder
运行批处理文件
public class Test {
public static void main(String[] args){
try {
ProcessBuilder processBuilder = new ProcessBuilder("pathToMyBatch.bat");
Process process = processBuilder.start();
StreamReader fluxSortie = new StreamReader(process.getInputStream());
StreamReader fluxErreur = new StreamReader(process.getErrorStream());
new Thread(fluxSortie).start();
new Thread(fluxErreur).start();
} catch (IOException e) {
e.printStackTrace();
}
}
static class StreamReader implements Runnable {
private final InputStream inputStream;
StreamReader(InputStream inputStream) {
this.inputStream = inputStream;
}
private BufferedReader getBufferedReader(InputStream is) {
return new BufferedReader(new InputStreamReader(is));
}
@Override
public void run() {
BufferedReader br = getBufferedReader(inputStream);
String ligne = "";
try {
while ((ligne = br.readLine()) != null) {
System.out.println(ligne);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
StreamReader
类是一个Runnable
类,它等待输入并打印每一个读取行
批处理文件只需调用java-classpath…
,即可启动其他java应用程序,并执行与此应用程序相关(或无关)的其他操作
我无法修改此批次
为了说明这一点:
程序A
启动批处理文件B
以启动应用程序C
当我直接从windows运行批处理文件B
时,java应用程序C
仅占用超过2%的CPU。但是当我通过java程序A
运行它时,C
消耗了25%的CPU负载(1个完整的内核)。
在这两种情况下,CPU上的批处理执行费用约为0%
我想这是由于java应用程序的输出和错误流没有得到正确处理
我说得对吗?我怎样才能解决这个问题?有没有办法获取子进程(进程的子进程)进程流
我想这是由于java应用程序的输出和错误流没有得到正确处理
我说得对吗
可能吧。但这是一个非常模糊的描述(你认为)正在发生什么
我怀疑问题出在您的StreamReader
类中。例如:
- 它可以在没有缓冲的情况下读取流
- 它可能正在轮询流
- 它可能以低效的方式处理(或积累)产出
- 或者别的什么
我怀疑是
System.out.println
调用的
或者,可能是子Java应用程序在编写输出时没有缓冲。您的标题是错误的。高负载是在Java应用程序中,而不是在子进程中。这就是为什么我写了
子进程
。也许你应该解释清楚。短语“子进程”没有意义。如果删除System.out.println(),会发生什么?有多少行写入程序C?你能测量C语言的性能吗?May by program C在作为独立应用程序启动时会花时间在println上,在使用pipe时会全速工作。我将其删除,并尝试使用适当的记录器,或者干脆将其丢弃。还是有同样的问题吗