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使うよりお手軽なのは確か。