JavaでThreadを強制終了する方法はないものだろうか...

多分無い。:-D


Winstone調べてたときに,わざと無限ループするサーブレットを動かして,監視ポート経由でシャットダウンできるかどうか試してみたら,ちゃんとシャットダウンできたんで,もしかして出来るかな?と思った次第。
でもそれは単なる勘違い。Winstoneの実行スレッド(RequestHandlerThread)は,Thread#setDaemon(true)となっているので,たとえそのスレッドが無限ループ状態に陥っていたとしてもシャットダウン・プロセスの邪魔をしないというだけだった。orz


やってみたかったのは,非同期処理とかってワケじゃなく,ユーザプログラムを監視可能なスレッドで実行したかった。コードで書くと,こんな感じか。

public class Executor implements Runnable {
    private Command command;

    public Executor(Command cmd) {
        command = cmd;
    }
    public void run() {
        cmd.execute();
    }
}
public interface Command {
    void execute();
}

---- 起動方法 ----
Thread thread = new Thread(new Executor(new SomeCommand()));
thread.setDaemon(true);
thread.start();

そこで監視だけでなく,管理もしてみたいなぁと,たとえば「タイムアウト越えたら強制終了させる」とかだ。でもね,Thread.interrupt()を送ったとして,だれがInterruptExceptionを受け取るのか?
この実装では誰もいない。orz


グレースフルにスレッドを終わらせようと思えば,「Two-Phase Termination」あたりを利用するんだろうけど,実行される側(Command)は,そんな都合知らんだろうし。そもそも,タイムアウトだとか無限ループで暴走状態にあるスレッドをグレースフルに終わらす必要もないだろとか思いつつも,決定打にいたらずだった。


なお,禁断の秘術であるThread.stop()を使うと,無限ループ状態だろうと見事に止めてくれる。一瞬,これでもいいんじゃないかと思ったけど,あたし自信,スレッドに対する理解が甘いので,もうしばらく調べてみようと思う。
#それに,どうしても実現したいワケでもないし。


ps.
Java5から登場したExecutorServiceも使ってみたんだけど,これのshutdownNow()も運が良かったら止まる程度でしかなかった。でも,Thread使うよりお手軽なのは確か。