Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 子进程中的高CPU负载_Java_Processbuilder - Fatal编程技术网

Java 子进程中的高CPU负载

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

我正在开发一个java程序,它使用
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时会全速工作。我将其删除,并尝试使用适当的记录器,或者干脆将其丢弃。还是有同样的问题吗