Lambda Probeにおけるスレッドの強制停止

Javaのスレッドがグレースフル・シャットダウンできないことを知りつつも,余所でなんかやってないかなぁと思案しているときに思い出したのがコレ。
Tomcat Probe改めλProbeにはスレッドの一覧表示とその停止機能がついている。

当然,興味あるから早速ソース取ってきて,どうやってるか調べてみたよ。結果は予想通りというか,やっぱりThread.stop()を使っておりました。

== KillThreadController ==
  protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
    String threadName = RequestUtils.getStringParameter(request, "thread", null);
    String view = RequestUtils.getStringParameter(request, "view", getViewName());

    Thread thread = null;
    if (threadName != null) thread = Utils.getThreadByName(threadName);

    if (thread != null) {
        thread.stop();   // <------ ココ
    }

    return new ModelAndView(view);
  }

んーってことは,やっぱりのっぴきならない事態ならば「Thread.stop()を使うもやむなし」と理解するぞ。利用事例がひとつでもあるだけで随分と強気だ。:-D


なお,Thread.stop()を呼び出す直前にある「Utils.getThreadByName(threadName);」が気になったので覗いてみた。

  public static Thread getThreadByName(String name) {
    if (name != null) {
      //
      // get top ThreadGroup
      //
      ThreadGroup masterGroup = Thread.currentThread().getThreadGroup();
      while (masterGroup.getParent() != null) {
        masterGroup = masterGroup.getParent();
      }

      Thread threads[] = new Thread[masterGroup.activeCount()];
      int numThreads = masterGroup.enumerate(threads);

      for (int i = 0; i < numThreads; i++) {
        if (threads[i] != null &amp;&amp; name.equals(threads[i].getName())) {
          return threads[i];
        }
      }
    }
    return null;
  }

ほっほう。これは「いつの日かコードスニペット」として覚えさせていただきます。
ごちそうさまでした。


ps.
λProbe 1.3.0.3b使ってたんだけど,最新版(1.7b)だと,また随分と機能が増えたのね。下手な商用APサーバの管理コンソールより断然便利だ。