Executors.newFixedThreadPool挂起了线程

mak*_*aks 4 java multithreading tomcat

正如它在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");
                }
            });
      }
Run Code Online (Sandbox Code Playgroud)

在我将它们提交给ExecutorService之前,上述示例中的线程不存在.当main方法结束时,我javaw.exe在任务管理器的进程列表中看到一个(win 7 os).所以我假设运行该示例的jvm实例仍然存在.当我添加时s.shutdown()- 进程列表中没有任何java进程.

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

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

Gra*_*ray 10

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

如果它没有关闭ExecutorService然后是,它将挂起.

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

就在这里.您可以提供线程工厂.

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

编辑:

正如@matt b所提到的,另一种机制是在Tomcat中定义一个关闭钩子/监听器:

用于java Web应用程序的shutdown hook

  • 另请注意,如果您在 web 应用程序中创建 Executor 或 ThreadPool,最好设置一个 ContextListener 来关闭 executor/pool,这样您就可以让您的任务有机会完全关闭,而不是在他们的工作中间突然终止。 (2认同)