你的位置:首页 > Java教程

[Java教程]web应用关闭后线程不回收问题


  今天看《spring3.0企业应用开发实战》中关于web应用程序中调度器的启动和关闭问题中有这样一段话:

  静态变量是ClassLoader级别的,如果web应用程序停止,这些静态变量也会从jvm中清除。但是线程则是JVM级别的,如果用户在web应用中启动一个线程,这个线程的生命周期并不会和web应用程序保持同步。也就是说,即使停止了web应用,这个线程也依旧是活跃的。

  因此为了真正的验证上面的结论,实战了一下书中的例子

一 配置tomcat应用管理页面

1.首先启动tomcat后,通过web端访问http://localhost:8080/,出现下面页面

3.因不知道用户名密码,直接取消掉,出现错误信息提示新页面

6.因此直接在tomcat用户的角色上添加manager-gui就可以访问页面了

7.重启tomcat,用户名tomcat,密码tomcat登录,就可以查看应用管理相关页面了。


2.部署应用,并启动tomcat,程序运行如下

-----Sat Jan 02 22:42:59 CST 2016-----Sat Jan 02 22:43:00 CST 2016-----Sat Jan 02 22:43:01 CST 2016-----Sat Jan 02 22:43:02 CST 2016

3.通过tomcat web管理页面直接停止应用,下图中的WebTest

 

5.从上面可以看出,web应用的确运行了contextDestroyed方法来进行相关的销毁操作,但是观察应用运行状态,

应用程序中的线程还是running

6.当然该处程序可以通过timer.cannel()方法来收工回收关闭定时器来关闭线程

7.github代码地址https://github.com/lixiaojiao2010/WebTest

  由此可以验证文章开始的时候的结论的正确性。