2

在一段时间内使用 JConsole 监控我们的应用程序表明“活动线程”计数在不断增加。增加线程数对我来说听起来像是一件坏事,还是我错了?

概要:在我们的应用程序中,我们使用 Executors.newFixedThreadPool、Executors.newSingleThreadScheduledExecutor 为各种收集器创建线程池。这些收集器每隔几分钟就会被调用一次。还有一个其他服务,在每次收集期间,上述收集器都会调用 n 次。此服务生成执行 FutureTask 的单个线程 (Executors.newFixedThreadPool(1);)。对于上述所有 ExecutorServices,我们仅在捕获到异常时才调用 shutdownNow(),并将其余部分留给 GC。

1) 进程完成后是否需要关闭执行程序,还是可以依赖 GC?

感谢您的建议和见解

4

2 回答 2

1

线程池的目的是避免在处理过程中产生新线程的开销。你不应该产生新的线程!(这就是你在这里做的Executors.newFixedThreadPool(1);

您应该在应用程序启动时设置线程池,并将它们注入到您的处理对象中。

于 2012-07-06T17:30:52.613 回答
1

应该在执行程序服务上显式调用关闭 - executor.shutdown() 以有序关闭和回收资源(执行旧任务,不接受新任务)。

shutdownNow() 尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表(不能保证正在执行的任务 - 它们可能会或可能不会执行 - 这是最好的试图)。

于 2012-07-06T17:06:55.767 回答