0

Javaで複数のプロセスを実行するのに問題があります。

ベクトルからプロセスを実行するループがありcmdsます。現在、最初のプロセスを実行してから、2番目のプロセスがハングします。

   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();
   }

各プロセスの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();
4

1 に答える 1

6
  1. プロセスの入力ストリームを閉じる必要があります。
  2. すべての標準出力が標準エラーの前に書き込まれるとは限りません。exec()の前にこれらのストリームをマージするか、別のスレッドでそれらの1つを読み取る必要があります。
于 2013-02-21T12:28:00.300 に答える