进程挂在java中,即使我已经读取(输入/错误)流,waitFor()也会永远占用

Ade*_*eeb 0 java process stream

我在使用Java运行多个进程时遇到问题.

我有一个从向量运行进程的循环cmds,它当前运行第一个进程,然后第二个进程挂起.

   ProcessBuilder proc = null;
   for (String cmd:cmds){
       proc = new ProcessBuilder(cmd.split("\\s"));
       Process p = proc.start();

       //Handle streams

       //in
       Scanner stdin = new Scanner(p.getInputStream());
       while(stdin.hasNextLine()){
            System.out.println(stdin.nextLine());
       }
       //err
       Scanner stderr = new Scanner(p.getErrorStream());
       while(stderr.hasNextLine()){
             System.out.println(stderr.nextLine());
       }
       //wait
       p.waitFor();
   }
Run Code Online (Sandbox Code Playgroud)

这个答案对我来说显然不起作用,因为我从每个进程的InputStream和ErrorStream中读取过.我有什么误会?

我怎样才能解决这个问题?

注意:我删除了我拥有的try块,因为它在这个示例代码中没有用处

编辑

 proc = new ProcessBuilder(cur_string.split("\\s"));
 proc. redirectErrorStream(true);
 final Process p = proc.start();//Runtime.getRuntime().exec(cur_string);
 //Handle streams
 //in
 new Thread(new Runnable(){
           public void run(){
                Scanner stdin = new Scanner(p.getInputStream());
                while(stdin.hasNextLine()){
                            System.out.println(stdin.nextLine());
                }
                stdin.close();
                }
        }).start();

  //wait
  p.waitFor();
Run Code Online (Sandbox Code Playgroud)

use*_*421 6

  1. 您必须关闭进程的输入流.
  2. 您不能假设所有标准输出都将在任何标准错误之前写入.您必须在exec()之前合并这些流,或者在单独的线程中读取其中一个.