解決

京浜東北線の人身事故でエライ足止め食らったが、どうにか始業時刻には間に合った。
先週から組んでる Java のバッチを今日もいじり倒してみる。今回のキモとなる部分がちょっと怪しいのでモンキーテストしていたら、やっぱり不良が出てしまった。以下分かる人向けのメモ

// スレッドクラスA
Process proc = null;
InputStream is = null;
InputStream es = null;
BufferedReader isbr = null;
BufferedReader esbr = null;
try {
    proc = Runtime.getRuntime().exec(cmd);
    // ?
    is = proc.getInputStream();
    es = proc.getErrorStream();
    isbr =  BufferedReader(new InputStreamReader(is));
    String line;
    while ((line = isbr.readLine()) != null) {
        // ?
        proc.waitFor();
        System.out.println(line);
    }
    // 略
} catch (InterruptedExceptione ) {
    // 略    
}

// スレッドクラスB
// 適当な時間 Sleep し、スレッドA を Interrupt() するクラス

スレッドAとBを起動して、処理が時間内に終わらなかったらタイムアウトするロジックを組んだんだけれど、タイムアウト時に子プロセスがなかなか死なないから困った。原因を探ったらどうも ? の waitFor() の場所がマズかったらしい。なかなか死なないのは isbr.readLine() で内部ループしているため、スレッドB からの Interrupt() が有効にならないから。waitFor() を ? の場所に移動したらタイムアウト時間できっちり子プロセスも強制終了でけた。
Java ってムズかしいね。