tomcat 关闭不了

         最近发布的项目,当想停止tomcat 服务一直停不掉,只能kill掉,后台也没错误。就开始查原因,原来项目中有quart定时任务在跑,导致程序在中开启了新的线程,而且未设置成daemon,造成的主线程不能退出tomcat中开启了新的线程,而且未设置成daemon,造成的主线程不能退出。

  首先:查看一下tomcat 进城id linux 命令:

ps -ef|grep tomcat

root     30710     1  0 09:57 ?        00:01:43 /usr/local/jdk1.7.0_76/bin/java -Djava.util.logging.config.file=/webapps/apache-tomcat-7.0.68/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/webapps/apache-tomcat-7.0.68/endorsed -classpath /webapps/apache-tomcat-7.0.68/bin/bootstrap.jar:/webapps/apache-tomcat-7.0.68/bin/tomcat-juli.jar -Dcatalina.base=/webapps/apache-tomcat-7.0.68 -Dcatalina.home=/webapps/apache-tomcat-7.0.68 -Djava.io.tmpdir=/webapps/apache-tomcat-7.0.68/temp org.apache.catalina.startup.Bootstrap start

其次用jdk工具查看一下:

jstack 30710

如下:

[root@localhost bin]# jstack 30710
2017-01-20 14:47:33
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.76-b04 mixed mode):

"Attach Listener" daemon prio=10 tid=0x00007fb25c001000 nid=0xec7 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"DestroyJavaVM" prio=10 tid=0x00007fb290009000 nid=0x77f7 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Timer-3" daemon prio=10 tid=0x00007fb24409d800 nid=0x783d in Object.wait() [0x00007fb27e3aa000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.util.TimerThread.mainLoop(Timer.java:552)
	- locked <0x00000000fac7c4b8> (a java.util.TaskQueue)
	at java.util.TimerThread.run(Timer.java:505)

"Timer-2" daemon prio=10 tid=0x00007fb24409b800 nid=0x783c in Object.wait() [0x00007fb27e4ab000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.util.TimerThread.mainLoop(Timer.java:552)
	- locked <0x00000000fad30560> (a java.util.TaskQueue)
	at java.util.TimerThread.run(Timer.java:505)

"Timer-1" daemon prio=10 tid=0x00007fb244094800 nid=0x783b in Object.wait() [0x00007fb27e5ac000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00000000fad30cc0> (a java.util.TaskQueue)
	at java.util.TimerThread.mainLoop(Timer.java:552)
	- locked <0x00000000fad30cc0> (a java.util.TaskQueue)
	at java.util.TimerThread.run(Timer.java:505)

"schedulerFactoryBean_QuartzSchedulerThread" prio=10 tid=0x00007fb244092800 nid=0x783a in Object.wait() [0x00007fb27e6ad000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:410)
	- locked <0x00000000fad33ff0> (a java.lang.Object)


有上面可以看出 "Attach Listener" daemon prio=10  是守护状态的线程
"schedulerFactoryBean_QuartzSchedulerThread" prio=10  是非守护线程
Daemon的作用是为其他线程的运行提供服务,比如说GC线程。其实User Thread线程和Daemon Thread守护线程本质上来说去没啥区别的,唯一的区别之处就在虚拟机的离开:如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了
从上面可以看出用户线程并没有离开处于wait状态
所以要想使tomcat 应用关闭,线程也需要销毁才行,那么在web应用中 httpServlet 中请求中destroy() 方法中  
让SchedulerFactoryBean  调用destroy()方法就可以。



    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值