# Tomcat停止时无法正常关闭?
## 背景
在调tomcat的shutdown命令,或者在编辑器里点关闭web服务,可能会出现关不掉的情况,控制台可能也不报错,表现就是卡住了,那应该如何排查tomcat无法正常shudown的情况?
## 为什么tomcat不能正常关闭?
文末的参考文档说的很详细了,我这里再总结下:不是tomcat关不掉,而是tomcat启动的应用某些线程没正常关闭, 再明确点就是:项目中有非daemon的线程没关闭。具体原因大家再百度百度吧。
## 解决方案
知道了什么原因,解决方案就很简单了:关闭命令调用后,看还有哪些非daemon线程还活着,然后下面二选一:
- 把这个线程关闭,如果是属于线程池的线程,则关闭线程池
- 更暴力点,把这个线程的daemon属性设为true。<font color=red>如果是关键业务,则最好是使用正常的线程关闭</font>
## 应该怎么排查?
一旦调用了命令,断点的线程都被释放了,那怎么排查哪些非daemon还活着?
答案是arthas工具,虽然调用了tomcat的shutdown的命令,但jvm还存活着,此时arthas依然可以连接上,然后调用thread命令即可查看当前所有存活的线程。
所以一个很好的开发习惯是:<font color=red>业务中创建的线程都必须自定义名字,包括走线程池创建的线程。</font>
![Tomcat停止时无法正常关闭](https://oss.yeas.fun/halo-yeas/tomcat_shutdown1_1641010543472.png)
然后,基于线程名字到对应业务中进行上面所说的二选一操作。处理完成,web即可正常关闭。
## 参考文档
https://blog.csdn.net/u012454773/article/details/54584874
## --- END ---
Tomcat停止时无法正常关闭?