Executors.newFixedThreadPool挂起了线程

时间:2012-09-14 13:30:55

标签: 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");
                }
            });
      }

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

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

问题2 :如果上一个问题的答案是肯定的,是否有一些方法可以让池中的线程成为deamon,或者是否有一些方法可以处理这样的tomcat / myapp停止来调用{ {1}}

1 个答案:

答案 0 :(得分:10)

  

问题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中定义一个关闭钩子/监听器:

  

shutdown hook for java web application