2009年6月24日水曜日

アプリケーションの停止とスレッドの停止

アプリケーションの停止とスレッドの停止:
環境:
WAS6.1+WindowsXP
仕様:
スレッドは、Servletアプリケーションで呼ばれている
要求:
Websphereの管理コンソールであるServletアプリケーションを停止する
かつ、該当Servletアプリケーションが呼び出しているスレッドも停止する
現状:
Websphereの管理コンソールで対象Servletアプリケーションを停止しても、
該当Servletアプリケーションに呼ばれているスレッドの停止ができない

解決方法:
対象スレッドのrun()メッソドにあるwhile(true)ループに対して、常にループ
できるではなく、条件をつけるようにする。

1.対象スレッドに、下記変数と対応メッソドを定義する
private volatile Thread blinker;
public void setThreadObject(Thread blinker){
this.blinker=blinker;
}

2.run()にあるwhile(true){}に対して、下記のように条件をつける
Thread current = Thread.currentThread();
while (this.blinker==current) {}

3.Servletのinit()に変数blinkerの初期値と終了値を設定
this.qrViewWatcher.setThreadObject(this.qrViewWatcher);

4.Servletのfinalize()に変数blinkerの終了値を設定
this.qrViewWatcher.setThreadObject(null);

上記設定によって、Servletアプリを停止すると、該当アプリオブジェクトが呼び出した
スレッド対象のrun()が機能しないようになる(while(){}を実行しない)。
また、Servletアプリを始動すると、新しいIDを持っているスレッドが動作する
(元のスレッドは、一定時間に経って、GCより回収されるかな?)
これで、Servletアプリの動作は、中にあるスレッドの動作と一致される。
※もちろん、TomcatのようにWebsphereAPサーバを停止すれば、スレッドも一緒に停止される

0 件のコメント: