com.sun.messaging.jmq.jmsserver.service.HAMonitorService类 包含HATimerThread,它启动一个java Thread然后运行它( HATimerThread是一个Runnable)。
此主题不是deamon主题。
运行代码如下;
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.但是一次 在构造函数中设置(由HAMonitorService&#39; s调用) 调用它的构造函数使得它不是0)似乎没有 更改。这意味着循环永远不会退出,这意味着反过来 线程永远不会停止,因为它不是守护程序线程,而是VM 永远不会关闭。
这是一个错误还是有一些其他机制阻止了我 还没有想过?目前正在运行我的嵌入式进程 集群代理永远不会退出,即使其余部分也是如此 彻底关闭......
尝试使用4.5.2和5.1。
我重建了5.1的源代码,将HATimerThread创建的线程设置为deamon,现在一切正常。
答案 0 :(得分:0)
根据甲骨文的Amy Kang的说法
“HAMonitorService中的HATimerThread应该在代理未终止或者util代理调用System.exit()以终止或重新启动时运行。但是它可以成为守护程序线程。”