# 使用后台进程和 Shutdown Hook 友好地关闭 Tomcat
严重的问题就是在 JVM 关闭时,行为不良的线程不会被关闭。
你可能会问:为什么这会成为问题……好吧,对程序员来说这真的算不上一个问题,只要随便写点代码就可以解决。但是对使用软件的人而言这却会带来不必要的麻烦。原因是这样会产生很多行为不良的线程,而执行 Tomcat 的 shutdown.sh 命令收效甚微。这时你不得不执行下面命令野蛮的杀掉 web 服务器:
ps -ef | grepjava
先得到进程 pid,然后
kill -9 <>
……接着需要有一大片 web 服务器需要重启,这种混乱绝对让人头痛。最后你执行 shutdown.sh 停止 Tomcat。
在我最近的几篇博客里,我编写的那些行为不良的线程在 run() 方法开头都包含了下面的代码:
Override
public void run() {
while (true) {
try {
DeferredResult result = resultQueue.take();
Message message = queue.take();
result.setResult(message);
} catch (InterruptedException e) {
throw new UpdateException("Cannot get latest update. " + e.getMessage(), e);
}
}
}
在上面的代码里,