Tomcatの起動時にデーモンライクな動作をさせようと思ったのですが、方法が分からないので、サーブレットからスレッドの起動、停止、ステータスチェックを実施するサンプルをつくってみました。
サーブレット側から状態確認ができるようにThread側にbooleanのフラグを作成し、run()の中で初期化して、これをサーブレット側でみてスレッドの状態を確認できるようにしました。ここで、思ったような状態が表示されなかったのがスレッドの起動のタイミングでした。
サーブレット側ではこんな感じでスレッドの状態を確認します。
t=new TestThread();
t.start();
その後、t内部のフラグの状態を確認します
if (t.startF)….といった感じ。
一方Threadの内部
run(){
startF=true;
}
こんな感じにしておけば、サーブレットのコードの中では先にt.start()が呼ばれているので、t.startFはtrueになっていると思っていたのですが、実際にはこの時点ではfalseでした。
よく考えてみると、もちろんThreadのコンストラクタはその時点では実行されてインスタンスは存在するのでしょうが、start()はおそらく、threadを実行キューに入れるだけなんだと思います。実際にrun()が呼ばれるのはCPUに余裕があるとき、つまり、サーブレットの実行終了後に実行されると考えたほうがよさそうです。