【问题标题】:Executors.newFixedThreadPool hanged threadsExecutors.newFixedThreadPool 挂线程
【发布时间】:2012-09-14 13:30:54
【问题描述】:

正如它在 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进程。

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

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

【问题讨论】:

    标签: java multithreading tomcat


    【解决方案1】:

    问题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 提到的,另一个确保线程池关闭的机制是define a shutdown hook/listener in Tomcat

    【讨论】:

    • 请注意,如果您使用的是番石榴(如果您没有使用,为什么不呢?)可以从 MoreExecutors.daemonThreadFactory() 获得这样的 ThreadFactory。
    • 还要注意,如果你在 webapp 中创建一个 Executor 或 ThreadPool,最好设置一个 ContextListener 来关闭 executor/pool,这样你就可以让你的任务有机会干净地关闭而不是突然关闭在他们的工作中终止。
    • 好点@matt。我已经添加了一些相关信息的链接。
    • 我最近听说应用服务器在关闭时会杀死所有此类线程(如果它们存在),是真的吗?
    • 我不知道@maks,但希望其他有直接经验的人加入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2011-04-15
    • 2014-09-15
    • 1970-01-01
    相关资源
    最近更新 更多