2012-09-14 76 views
4

因爲它在JavadocExecutors.newFixedThreadPool上吊線

說,在池中的線​​程將存在 直到它被明確ExecutorService#shutdown()

shutdowned如果我在Tomcat Web應用程序。在啓動時它創建一個固定的線程池。我也調查過

 public static void main(String ... strings) { 
      ExecutorService s = Executors.newFixedThreadPool(2); 
      s.submit(new Runnable() { 
       public void run() { 
         System.out.println("zzz"); 
       } 
      }); 
     } 

上述示例中的線程在我將它們提交給ExecutorService之前不存在。當main方法結束時,我在任務管理器(win 7 os)的進程列表中看到一個javaw.exe。所以我假設運行該示例的jvm的實例仍然存在。當我添加s.shutdown() - 進程列表中沒有任何java進程。

問題1:當tomcat由於某些錯誤而突然停止時,Java進程是否會掛在內存中(如果以前某些任務被提交到上述線程池中);

問題2:如果答案previouse問題是肯定的,是否有一些方法來使池中的線程是守護進程或許是有一些方法來處理這樣的tomcat/MYAPP停止調用ExecutorService#shutdown()

回答

10

問題1:當tomcat由於某些錯誤而突然停止時,Java進程是否掛在內存中(如果先前某些任務已提交給上述線程池);

如果它沒有關閉ExecutorService那麼是的,它會掛起。

問題2:如果回答previouse問題是肯定的,是否有一些方法來使池中的線程是守護進程......

是的,有。你可以提供一個線程工廠。

ExecutorService threadPool = newFixedThreadPool(numThreads, 
    new ThreadFactory() { 
     public Thread newThread(Runnable runnable) { 
      Thread thread = Executors.defaultThreadFactory().newThread(runnable); 
      thread.setDaemon(true); 
      return thread; 
     } 
    }); 

編輯:

如@馬特B中提及的,另一種機制是在Tomcat中定義一個關閉掛鉤/聽衆:

shutdown hook for java web application

+1

注如果你使用番石榴(如果你不是,爲什麼不呢?)例如,可以從MoreExecutors.daemonThreadFactory()獲得ThreadFactory。 –

+1

還注意到,如果您要在Web應用程序中創建Executor或ThreadPool,最好設置一個ContextListener來關閉執行程序/池,以便您可以讓任務有機會徹底關閉而不是在工作中突然終止。 –

+0

好點@matt。我已經添加了一些關於該信息的鏈接。 – Gray