Re:解決

今日は山手線が遅延ですかそうですか。
昨日のロジックはやっぱり解決にならなかった。Java で手っ取り早くタイムアウト起こすには、予想外のアプローチで解決することになった。スレッドやプロセス使わなくてもできるんだな。

import java.util.*;

public class foobar {
    public void foobar() {
        // とりあえず10秒待ってタイムアウト
        long n = 10;
        Timer tm = new Timer();
        // タイムアウト処理を10秒後に呼び出すようにスケジュール
        tm.schedule(new timeout(), n * 1000L, Long.MAX_VALUE);
        // ここから処理開始
        ...
        // キャンセル処理を行わないとタイムアウト処理が終わるまでプログラムそのものが終了しない
        tm.cancel();
        tm = null;
    }

    class timeout extends TimerTask {
        public void run() {
            // タイムアウト処理
            System.out.println("タイムアウトしました。");
            System.exit(1);
        }
    }
}

タイマークラスを使った実装。強制終了するメソッドをスケジューリングして呼び出してやると、どんな処理中でも強制終了できる。タイムアウト前に処理が終了した場合はスケジューリングしたタイマークラスをキャンセルしてやらないといけない。
Process.destroy() だとすぐに強制終了しないのは何故だろう。