2012-07-06 37 views
1

使用JConsole监控我们的应用一段时间显示“活动线程”数量不断增加。增加线程数对我来说听起来像是一件坏事,或者我错了?Jconsole活动线程数和java ExecutorService

剧情简介: 在我们的应用程序中,我们使用Executors.newFixedThreadPool,Executors.newSingleThreadScheduledExecutor为各种收集器创建线程池。这些收集器每隔几分钟就会被调用一次。 还有这个其他的服务,每次收集时都被上述收藏家称为n次。该服务生成一个执行FutureTask的单线程(Executors.newFixedThreadPool(1);)。对于所有上述的ExecutorServices,只有在捕获到异常时才会调用shutdownNow(),并将剩下的GC留给它。

1)当流程完成后我需要关闭执行程序还是可以依赖GC?

感谢您的建议和见解 Ajju

+0

你觉得这两个答案有用吗? – 2012-07-07 21:40:13

回答

1

每个人都应该明确地调用shutdown上执行服务 - executor.shutdown()对资源的有序关闭&回收(旧任务的执行,而新的不被接受)。

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

+0

感谢您的回复。 我们使用shutdownNow()来达到类似目的,以停止所有正在执行的进程。 – Ajju 2012-07-09 15:02:11

1

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

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

+0

感谢您的回复。 我明白你的观点,并会尝试寻求解决方案。 – Ajju 2012-07-09 15:04:10