com.sun.messaging.jmq.jmsserver.service.HAMonitorService クラスには、Java Thread を開始する HATimerThread が含まれており、Java Thread がそれを実行します ( HATimerThread は Runnable です)。
このスレッドはデーモン スレッドではありません。
run のコードは次のとおりです。
public void run() {
while (true) {
long time = System.currentTimeMillis();
synchronized(this) {
if (time < nexttime) {
try {
this.wait(nexttime - time);
} catch (InterruptedException ex) {}
continue;
} else {
child.run();
}
}
if (repeatItr == 0) break;
time = System.currentTimeMillis();
long tmpnext = nexttime + repeatItr;
if (time >= tmpnext) {
nexttime = time;
} else {
nexttime = tmpnext;
}
}
}
このスレッドが終了できる唯一の方法は、repeatItr == 0 の場合です。ただし、コンストラクター (0 以外になるように呼び出す HAMonitorService のコンストラクターによって呼び出される) で設定されると、何も変更されないようです。これは、ループが終了しないことを意味します。つまり、スレッドが停止することはありません。また、デーモン スレッドではないため、VM がシャットダウンすることはありません。
これはバグですか、それとも私が考えていなかったそれを止める他のメカニズムがありますか? 現時点では、組み込みクラスターブローカーを実行しているプロセスは、残りのプロセスが正常にシャットダウンしても、このため終了しません...
これは4.5.2と5.1を使用してみました。
HATimerThread によって作成されたスレッドをデーモンに設定して 5.1 のソースを再構築したところ、すべて正常に動作するようになりました。