web應用關閉後線程不回收問題,web應用線程回收

來源:互聯網
上載者:User

web應用關閉後線程不回收問題,web應用線程回收

  今天看《spring3.0公司專屬應用程式開發實戰》中關於web應用程式中調度器的啟動和關閉問題中有這樣一段話:

  靜態變數是ClassLoader層級的,如果web應用程式停止,這些靜態變數也會從jvm中清除。但是線程則是JVM層級的,如果使用者在web應用中啟動一個線程,這個線程的生命週期並不會和web應用程式保持同步。也就是說,即使停止了web應用,這個線程也依舊是活躍的。

  因此為了真正的驗證上面的結論,實戰了一下書中的例子

一 配置tomcat應用管理頁面

1.首先啟動tomcat後,通過web端訪問http://localhost:8080/,出現下面頁面

2.點擊Manager App開啟輸入使用者名稱密碼快顯視窗

3.因不知道使用者名稱密碼,直接取消掉,出現錯誤資訊提示新頁面

4.從上面的新頁面中可以看出來,意思是如果沒有改動設定檔的情況下,直接開啟conf目錄下的tomcat-users.xml檔案,通過添加角色到使用者上面可以訪問對應的許可權頁面

  • manager-gui:訪問html頁面,(即URL路徑為/manager/html/*),有訪問status許可權
  • manager-script:訪問純文字,(即URL路徑為/manager/text/*),有訪問status許可權
  • manager-jmx:訪問JMX代理,(即URL路徑為/manager/jmxproxy/*),有訪問status許可權
  • manager-status:查看應用狀態。

5.從tomcat的協助文檔中也可以找到相關資訊,http://localhost:8080/docs/manager-howto.html中,

6.因此直接在tomcat使用者的角色上添加manager-gui就可以訪問頁面了

7.重啟tomcat,使用者名稱tomcat,密碼tomcat登入,就可以查看應用管理相關頁面了。

 

二 代碼驗證

1.建立web應用程式,並建立TimerListenerTest類,實現ServletContextListener,代碼如下

 1 package com.test.timer; 2  3 import java.util.Date; 4 import java.util.Timer; 5 import java.util.TimerTask; 6  7 import javax.servlet.ServletContextEvent; 8 import javax.servlet.ServletContextListener; 9 10 public class TimerListenerTest implements ServletContextListener {11 12     private Timer timer;13 14     @Override15     public void contextDestroyed(ServletContextEvent arg0) {16         System.out.println("---應用關閉---");17     }18 19     @Override20     public void contextInitialized(ServletContextEvent arg0) {21         System.out.println("---應用開啟---");22 23         timer = new Timer();24 25         TimerTaskTest task = new TimerTaskTest();26 27         timer.schedule(task, 1000L, 1000L);28     }29 30     class TimerTaskTest extends TimerTask {31 32         @Override33         public void run() {34             System.out.println("-----" + new Date());35         }36     }37 38 }

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

4.觀察後台運行,出現

 

5.從上面可以看出,web應用的確運行了contextDestroyed方法來進行相關的銷毀操作,但是觀察應用運行狀態,

應用程式中的線程還是running

6.當然該處程式可以通過timer.cannel()方法來收工回收關閉定時器來關閉線程

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

  由此可以驗證文章開始的時候的結論的正確性。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.