4

正如它在javadoc中所说

池中的线程将一直存在,直到它被显式关闭ExecutorService#shutdown()

如果我在 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方法结束时,我javaw.exe在任务管理器(win 7 os)的进程列表中看到一个。所以我假设运行该示例的 jvm 实例仍然存在。当我添加时s.shutdown()- 进程列表中没有任何 java 进程。

问题1:当tomcat由于一些错误突然停止时,java进程是否会在内存中挂起(如果之前有一些任务被提交到上面提到的线程池中);

问题 2:如果对上一个问题的回答是肯定的,是否有一些方法可以使池中的线程成为守护进程,或者是否有一些方法可以处理此类 tomcat/myapp 停止调用ExecutorService#shutdown()

4

1 回答 1

11

问题1:当tomcat由于一些错误突然停止时,java进程是否会在内存中挂起(如果之前有一些任务被提交到上面提到的线程池中);

如果它没有关闭,ExecutorService那么是的,它将挂起。

问题2:如果上一个问题的答案是肯定的,是否有一些方法可以使池中的线程成为守护进程......

就在这里。你可以提供一个线程工厂。

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

正如@matt b 提到的,确保线程池关闭的另一种机制是在 Tomcat 中定义一个关闭挂钩/侦听器。

于 2012-09-14T13:34:01.323 回答