首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Executors.newFixedThreadPool挂螺纹

Executors.newFixedThreadPool挂螺纹
EN

Stack Overflow用户
提问于 2012-09-14 13:30:54
回答 1查看 3.4K关注 0票数 4

正如它在javadoc中所说的

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

如果我在Tomcat上有一个网络应用程序。启动时,它会创建一个固定的线程池。我也调查过

代码语言:javascript
复制
      public  static void main(String ... strings)  {
            ExecutorService s = Executors.newFixedThreadPool(2);
            s.submit(new Runnable() {
                public void run() {
                        System.out.println("zzz");
                }
            });
      }

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-14 13:34:01

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

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

问题2:如果前面的问题的答案是“是”,那么有什么方法可以使池中的线程成为碎片呢?

是的有。您可以提供线程工厂。

代码语言:javascript
复制
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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12425620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档