Runtime.getRuntime().exec()における出力とエラーフローによるブロックの問題


テストされたスクリプトコード
 
#/bin/sh

echo "step 1"
i=0
while [ $i -lt 100 ]
do
    expr 1 / 0
    i=`expr $i + 1`
done
echo "step 2"

エラーメッセージが少ない場合は、エラーフローの情報を処理しなくても問題ありません
import java.io.*;

public class T {

    public static void main(String[] args) throws Exception {
        final Process p = Runtime.getRuntime().exec("/data/home/robinmei/t.sh");

        p.waitFor();
        p.exitValue();
    }

}

 
しかし、スクリプト内のエラー情報が多く、例えば100を10000に変更すると、ブロックが発生する可能性があります.ここでのバージョンは、エラーフロー内の情報をタイムリーにスレッドで取り出すことです.
 
最終的にスムーズに実行できるコード
 
import java.io.*;

public class T {

    public static void main(String[] args) throws Exception {
        final Process p = Runtime.getRuntime().exec("/data/home/robinmei/t.sh");

        Thread outThread = new Thread() {
            public void run() {
                try {
                    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        System.out.println("out=[" + line + "]");
                    }
                } catch (Exception e) {
                }
            }
        };
        outThread.start();

        Thread errThread = new Thread() {
            public void run() {
                try {
                    BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        System.out.println("err=[" + line + "]");
                    }
                } catch (Exception e) {
                }
            }
        };
        errThread.start();

        outThread.join();
        errThread.join();

        p.waitFor();
        p.exitValue();
    }

}